https://mp.weixin.qq.com/s/zo7zmEVXvxgr80n6H_49Mg Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go 官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。
https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/104471078/ https://gocn.vip/topics/9899 Go 提供了功能完备的标准网络库:net包,net包的实现相当之全面,http\tcp\udp 均有实现且对用户提供了简单友好的使用接口。在 Linux 系统上 Go 使用了 epoll 来实现 net 包的核心部分,本文从用户接口层入手,分析 Go 在 Linux 平台上的 epoll 使用,文中若有不当之处请指出。
之前在 Apache/dubbo-go(以下简称 dubbo-go )社区中,有同学希望配置文件不仅可以放于本地,还可以放于配置管理中心里。那么,放在本地和配置管理中心究竟有哪些不一样呢?
我们在做系统时,很多时候是处理实时的任务,请求来了马上就处理,然后立刻给用户以反馈。但有时也会遇到非实时的任务,比如确定的时间点发布重要公告。或者需要在用户做了一件事情的X分钟/Y小时后,EG: “PM:我们需要在这个用户通话开始10分钟后给予提醒给他们发送奖励”对其特定动作,比如通知、发券等等。一般我接触到的解决方法中在比较小的服务里都会自己维护一个backend,但是随着这种backend和server增多,这种方法很大程度和本身业务耦合在一起,所以这时需要一个延时队列服务。 topic_list队列:每一个来的延时请求都应该又一个延时主题参考kafka,在逻辑上划分出一个队列出来每个业务分开处理; topic_info队列:每一个队列topic都存在一个新的队列里,每次扫描topic信息检测新的topic建立与销毁管理服务协程数量; offset:当前消费的进度; new_offset:新消费的进度,预备更迭offset; topic_offset_lock:分布式锁。二、设计目标功能清单1、延时信息添加接口基于http调用2、拥有存储队列特性,可保存近3天内的队列消费数据3、提供消费功能4、延时通知性能指标预计接口的调用量:单秒单类任务数3500,多秒单类任务数1300压测结果:简单压测wrk写入qps:259.3s 写入9000条记录 单线程 无并发触发性能/准确率:单秒1000,在测试机无延长。单秒3000时,偶尔出现1-2秒延迟。受内存和cpu影响。三、系统设计交互流程 时序图 本设计基于http接口调用,当向topic存在的队列中添加消息的时候,消息会被添加到相应topic队列的末尾储存,当添加到不存在的相应topic队列时,首先建立新topic队列,当定时器触发的时候或者分布式锁,抢到锁的实例先获得相应队列的offset,设置新offset,就可以释放锁了让给其他实例争抢,弹出队列头一定数量元素,然后拿到offset段的实例去存储中拿详细信息,在协程中处理,主要协程等待下次触发。然后添加协程去监控触发。模块划分 1、队列存储模块 1·delay下的delay.base模块,主要负责接收写请求,将队列信息写入存储,不负责backend逻辑,调用存储模块 2、backend模块。delay下的delay.backend模块,负责时间触发扫描对应的topic队列,调用存储模块,主要负责访问读取存储模块,调用callback模块 1·扫描topic添加groutine 2·扫描topic_list消费信息 3·扫描topic_list如果一定时间没有消费到则关闭groutine 3、callback模块,主要负责发送已经到时间的数据,向相应服务通知 3、存储模块 1·分布式锁模块,系统多机部署,保证每次消费的唯一性,对每次topic消费的offset段进行上锁offset到new_offset段单机独享 2·topic管理列表,管理topic数量控制协程数 3·topic_list,消息队列 4·topic_info,消息实体,可能需要回调中会携带一些信息统一处理 4、唯一号生成模块。五、缓存设计目前使用全缓存模式key设计:topic管理list key: XX:DELAY_TOPIC_LIST type:listtopic_list key: XX:DELAY_SIMPLE_TOPIC_TASK-%s(根据topic分key) type:zsettopic_info key: XX:DELAY_REALL_TOPIC_TASK-%s(根据topic分key) type:hashtopic_offset key: XX:DELAY_TOPIC_OFFSET-%s(根据topic分key) type:stringtopic_lock key: xx:DELAY_TOPIC_RELOAD_LOCK-%s(根据topic分key) type:string六、接口设计delay.task.addv1 (延时队列添加v1)请求示例curl -d ‘{ “topic”: “xxx”, // 业务topic “timing_moment”: , // 单位秒,要定时时刻 “content”: “{}” // 消息体,json串 }’ ‘http://127.0.0.1:xxxx/delay/task/add’复制代码返回示例{ “dm_error”: 0, “error_msg”: “操作成功”, “task_id”:112345465765 }复制代码pull回调方式返回(v2不再支持)请求示例curl -d ‘{ “topic”: “xxxx”, // 业务topic “task_id”:1324568798765 // taskid,选填,有则返回特定消息 }’ ‘http://127.0.0.1:xxxx/delay/task/pull’复制代码返回示例{ “dm_error”: 0, “error_msg”: “操作成功” “content”:”{“\xxx”}” }复制代码delay.task.addv2 (延时队列添加v2)请求示例curl -d ‘{ “topic”: “xxx”, // 业务topic “timing_moment”: , // 单位秒,要定时时刻 “content”: “{ // 消息内容(json string) “sn”:”message.call”, // 服务发现名字(或为配置服务名) “url”:”/ev/tp/xxxx”, // 回调url “xxx”:”xxx” // 其他字段 }” }’ ‘http://127.0.0.1:xxxx/delay/task/add’复制代码示例curl -d ‘{ “topic”:”xxxx_push”, “content”:”{ “uid”:”111111”, “sn”:”other.server”, “url”:”/xxxx/callback”, “msg_type”:”gift”, }”, “timing_moment”:1565700615 }’ http://127.0.0.1:xxxx/delay/task/add复制代码返回示例{ “dm_error”: 0, “error_msg”: “操作成功”, “task_id”:112345465765 }复制代码七、MQ设计(v2不再支持)关于kafka消费方式返回:topic: delay_base_push