go语言实现在线聊天 go语言教程( 七 )


Q2:消息是否持久化?
消息持久化,通常是先存后发,存储用的redis,但落地用的mysql 。mysql只做故障恢复使用 。
Q3:消息风暴怎么解决的?
如果是发送情况下 , 普通产品是不需要限速的,对于较大产品是有发送队列做控速度,按人数 , 按秒进行控速度发放,发送成功再发送下一条 。
Q4:golang的工具链支持怎么样?我自己写过一些小程序千把行之内,确实很不错 , 但不知道代码量上去之后 , 配套的debug工具和profiling工具如何,我看上边有分享说golang自带的profiling工具还不错 , 那debug呢怎么样呢 , 官方一直没有出debug工具,gdb支持也不完善,不知你们用的什么?
是这样的 , 我们正常就是println,我感觉基本上可以定位我所有问题,但也不排除由于并行性通过println无法复现的问题,目前来看只能靠经验了 。只要常见并发尝试,经过分析是可以找到的 。go很快会推出调试工具的~
Q5:协议栈是基于tcp吗?
是否有协议拓展功能?协议栈是tcp,整个系统tcp长连接 , 没有考虑扩展其功能~如果有好的经验,可以分享~
Q6:问个问题,这个系统是接收上行数据的吧 , 系统接收上行数据后是转发给相应系统做处理么,是怎么转发呢,如果需要给客户端返回调用结果又是怎么处理呢?
系统上行数据是根据协议头进行转发 , 协议头里面标记了产品和转发类型,在coordinator里面跟进产品和转发类型,回调用户,如果用户需要阻塞等待回复才能后续操作,那通过再发送消息,路由回用户 。因为整个系统是全异步的 。
Q7:问个pushsdk的问题 。pushsdk的单连接,多app复用方式,这样的情况下以下几个问题是如何解决的:1)系统流量统计会把所有流量都算到启动连接的应用吧?而启动应用的连接是不固定的吧?2)同一个pushsdk在不同的应用中的版本号可能不一样,这样暴露出来的接口可能有版本问题,如果用单连接模式怎么解决?
流量只能算在启动的app上了,但一般这种安装率很高的app承担可能性大,常用app本身被检测和杀死可能性较少,另外消息下发量是有严格控制 的 。整体上用户还是省电和省流量的 。我们pushsdk尽量向上兼容 , 出于这个目的,push sdk本身做的工作非常有限,抽象出来一些常见的功能,纯推的系统 , 客户端策略目前做的很少,也有这个原因 。
Q8:生产系统的profiling是一直打开的么?
不是一直打开 , 每个集群都有采样,但需要开启哪个可以后台控制 。这个profling是通过接口调用 。
Q9:面前系统中的消息消费者可不可以分组?类似于Kafka 。
客户端可以订阅不同产品的消息,接受不同的分组 。接入的时候进行bind或者unbind操作
Q10:为什么放弃erlang,而选择go,有什么特别原因吗?我们现在用的erlang?
erlang没有问题,原因是我们上线后,其他团队才做出来,经过qa一个部门对比测试,在没有显著性能提升下,选择继续使用go版本的push,作为公司基础服务 。
Q11:流控问题有排查过网卡配置导致的idle问题吗?
流控是业务级别的流控,我们上线前对于内网的极限通信量做了测试,后续将请求在rpc库内,控制在小于内部通信开销的上限以下.在到达上限前作流控 。
Q12:服务的协调调度为什么选择zk有考虑过raft实现吗?golang的raft实现很多?。?比如Consul和ectd之类的 。
3年前,还没有后两者或者后两者没听过应该 。zk当时公司内部成熟方案,不过目前来看,我们不准备用zk作结合系统的定制开发,准备用自己写的keeper代替zk , 完成配置文件自动转数据结构,数据结构自动同步指定进程 , 同时里面可以完成很多自定义的发现和控制策略,客户端包含keeper的sdk就可以实现以上的所有监控数据,profling数据收集,配置文件更新,启动关闭等回调 。完全抽象成语keeper通信sdk,keeper之间考虑用raft 。

推荐阅读