上图左边的数组实际上是一个列表,这个列表按大小将内存分块,然后使用atomic操作进行CAS 。但实际要看测试数据了 , 池技术可以明显减少临时对象和内存的申请和释放,gc时间会减少,但加锁带来的并行度的降低 , 是否能给一段时间内的整体吞吐量带来提升,要做测试和权衡…
在我们消息系统,实际上后续去除了部分这种黑科技,试想在百万个协程里面做自旋操作申请复用的buffer和对象 , 开销会很大 , 尤其在协程对线程多对多模型情况下,更依赖于golang本身调度策略 , 除非我对池增加更多的策略处理,减少忙等,感觉是在把runtime做的事情,在应用层非常不优雅的实现 。普遍使用开销理论就大于收益 。
但对于rpc库或者codec库,任务池内部 , 这些开定量协程,集中处理数据的区域,可以尝试改造~
对于有些固定对象复用,比如固定的心跳包什么的,可以考虑使用全局一些对象,进行复用,针对应用层数据,具体设计对象池,在部分环节去复用,可能比这种无差别的设计一个通用池更能进行效果评估.
消息系统的运维及测试
下面介绍消息系统的架构迭代和一些迭代经验,由于之前在其他地方有过分享,后面的会给出相关链接,下面实际做个简单介绍 , 感兴趣可以去链接里面看
架构迭代~根据业务和集群的拆分,能解决部分灰度部署上线测试 , 减少点对点通信和广播通信不同产品的相互影响,针对特定的功能做独立的优化.
消息系统架构和集群拆分,最基本的是拆分多实例,其次是按照业务类型对资源占用情况分类,按用户接入网络和对idc布点要求分类(目前没有条件 , 所有的产品都部署到全部idc)
系统的测试go语言在并发测试上有独特优势 。
对于压力测试,目前主要针对指定的服务器,选定线上空闲的服务器做长连接压测 。然后结合可视化,分析压测过程中的系统状态 。但压测早期用的比较多,但实现的统计报表功能和我理想有一定差距 。我觉得最近出的golang开源产品都符合这种场景,go写网络并发程序给大家带来的便利 , 让大家把以往为了降低复杂度,拆解或者分层协作的组件,又组合在了一起 。
QA
Q1:协议栈大?。笔奔涠ㄖ圃颍?
移动网络下超时时间按产品需求通常2g,3G情况下是5分钟,wifi情况下5~8分钟 。但对于个别场景,要求响应非常迅速的场景,如果连接idle超过1分钟 , 都会有ping,pong , 来校验是否断线检测,尽快做到重新连接 。
Q2:消息是否持久化?
消息持久化 , 通常是先存后发,存储用的redis,但落地用的mysql 。mysql只做故障恢复使用 。
Q3:消息风暴怎么解决的?
如果是发送情况下,普通产品是不需要限速的,对于较大产品是有发送队列做控速度,按人数,按秒进行控速度发放,发送成功再发送下一条 。
Q4:golang的工具链支持怎么样?我自己写过一些小程序千把行之内,确实很不错,但不知道代码量上去之后 , 配套的debug工具和profiling工具如何,我看上边有分享说golang自带的profiling工具还不错,那debug呢怎么样呢 , 官方一直没有出debug工具 , gdb支持也不完善,不知你们用的什么?
是这样的,我们正常就是println,我感觉基本上可以定位我所有问题,但也不排除由于并行性通过println无法复现的问题,目前来看只能靠经验了 。只要常见并发尝试,经过分析是可以找到的 。go很快会推出调试工具的~
- 将数据保存到文件中c语言 将数据保存到mongodb
- 罗布人村天气 mysql语言具有的功能
- redis编程语言 redis对应c语言
- redis一般和什么语言一起开发 和redis类似的编程
- mongodb删除数据不释放空间 mongodb如何彻底卸载
- mongodb采用什么语言 mongodb的设计采用什么
- c连接mysql数据库 c连接mysql报错
- redis zset 延迟队列 redis延迟执行
- mongodb底层数据结构 mongodb底层语言
- redis主主同步延迟
