Modules

Posted by 夏泽民

https://mp.weixin.qq.com/s/zo7zmEVXvxgr80n6H_49Mg Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go 官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。



micro

Posted by 夏泽民

什么是微服务



epoll

Posted by 夏泽民

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 使用,文中若有不当之处请指出。



dubbo-go

Posted by 夏泽民

之前在 Apache/dubbo-go(以下简称 dubbo-go )社区中,有同学希望配置文件不仅可以放于本地,还可以放于配置管理中心里。那么,放在本地和配置管理中心究竟有哪些不一样呢?



golang的简单分布式延时队列服务

Posted by 夏泽民

我们在做系统时,很多时候是处理实时的任务,请求来了马上就处理,然后立刻给用户以反馈。但有时也会遇到非实时的任务,比如确定的时间点发布重要公告。或者需要在用户做了一件事情的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



Search

Popular posts

Anything in here will be replaced on browsers that support the canvas element

Recent posts

This blog is maintained by 夏泽民

Get in touch with me at 465474307@qq.com

Subscribe to our mailing list

* indicates required