文档章节

通讯中大量消息广播的设计和优化

泥水佬
 泥水佬
发布于 10/25 10:17
字数 1196
阅读 1748
收藏 45

消息广播场在网络通讯应用还是普遍存在,如游戏中玩家状态通知,聊天和公共消息发送等,但在面对大量业务消息广播的情况可能会面临一些性能上的问题需要处理;毕竟大量业务不仅在消息序列化上非常损耗CPU,在网络IO读写上因过于频繁也会引起大量的损耗,如果没有处理好的情况还是非常影响整全服务性能。

消息广播场景

一般的设计都是把消息先写入会话中,然后会话内部进行消息转化成协议数据最终通过Socket发送出去。这种设计不好的地方在于业务消息比较复杂,广播的会话数量规模比较大的情况那那整个消息协议数据转换就非常损耗性能!为什么一般这样设计呢,因为这样内部转换协议对Buffer的控制相对比较容易可控,只需要关心自己会话的消息协转换发送回收即可。

广播应用优化

通过把协议转换前置,然后再把Buffer转到会话再由Socket发送出去,这样做的好处非常明显就是在大量广播消息的时候性能非常出色,因为无论广播多少个会话只需要协议转换一次就可以。不过问题也非常明显,由于Buffer是应用者写入并共享到不同会话中,这样就导致Buffr不受内部管制,这样框架总体性能就不好控制。

整合优化

实际服务应用中,两种情况都会同时存在,不管谁的重权大小在设计只要倾向一边那框架都很难在性能上发挥着优势,毕竟你无法控制上层的应用所面对的情况和应用者的行为。为了更好的控制着性能,所以在实现这些基础功能组件的时候这两种情况都要有所考虑。

由于转换协议是一样的,可以把协议转换抽象出来,然后在发送消息的时候进行一个阀值判断;当超过阀值的时候就先转换消息然后再把buffer写入到会话中,如果没超过就由会话内部通过转换器处理buffer.这样在通讯中的buffer就可以管控起来,不过对于后者来说由于buffer可以进行共享发送,那在管理上就比较麻烦可以通过发送完成计数来处理;不过由于网络的不可控制这种控制非常困难(最简单的方法是内存块复制到单独的会话buffer中后回到池中,对于c#这些来说个人建议直接放弃对这一块的管理,毕竟在大量广播下已经降低了很多协议转换的开销)。

Socket写入数据层面的优化

对于C#语言来说Socket的Send方法还是比较损耗性能的,如果每秒要向1000个连接广播10条消息,在正常设计的情况那就意味着触发10000次的Socket的Send操作。虽然这个数量在现有的硬件资源来说并不会存在什么压力,但如果10000个连接或发送的密度更大呢?如果把这方面的损耗压减下来,留给业务处理那不是一件更好的事情!

在会话内部引用一个消息队列,发送的消息先写入队列,然后通过批量的方式把多个消息写入Buffer中,在发送完成后继续监测队列;发送完成和消息进入会话队列时会存在一个状冲突的过程,需要处理好之间的状态确保队列消息转换的一致性即可(使用定时器方式批量写入发送延时不好控制,特别是会话量比较大的情况下,不建议使用)。通过合并发送在大量小消息的情况下可以达到更高的带宽利用率和低IO读写量,从而让整体性能更出色。

© 著作权归作者所有

共有 人打赏支持
泥水佬

泥水佬

粉丝 69
博文 82
码字总数 51372
作品 7
广州
架构师
私信 提问
加载中

评论(6)

开源中国射线科科长
开源中国射线科科长
好文章 只可惜。。。Task优化Session内部的垂直用户消息队列。。。没有交文档。。。。我就是这么优化的
全体人员
全体人员

引用来自“BaiYang”的评论

没有“阀值”这种东西,那叫“阈值”(Threshold)。。。

阈(yu)值666
BaiYang
BaiYang
没有“阀值”这种东西,那叫“阈值”(Threshold)。。。
泥水佬
泥水佬

引用来自“久永”的评论

请问下,为什么不用“组播”呢?
组播已经是网络层面了,这里主要讲的是业务消息层面
梦天1261
梦天1261
我下意识的想法就是两个都有,然后再来一个IfElse的处理
久永
久永
请问下,为什么不用“组播”呢?
优化openfire服务器提升xmpp 效率的15个方法

1、禁用原生xmpp搜索,使组织架构、人员数据本地化保存,并使客户端数据同步服务器,降低原生xmpp搜索的iq消耗,因为搜索是im应用的频繁操作; 2、禁用roster花名册、禁用presence包通讯,企...

今幕明
2016/01/16
859
0
支付宝钱包系统内部架构图,架构设计

支付宝系统架构概况 典型处理默认 资金处理平台 财务会计 支付清算 核算中心 交易 柔性事务 支付宝的开源分布式消息中间件–Metamorphosis(MetaQ) Metamorphosis (MetaQ) 是一个高性能、高可...

洋哥6
2016/02/02
326
0
最全最强解析:支付宝钱包系统架构内部剖析(架构图)

支付宝系统架构概况 典型处理默认 资金处理平台 财务会计 支付清算 核算中心 交易 柔性事务 支付宝的开源分布式消息中间件–Metamorphosis(MetaQ) Metamorphosis (MetaQ) 是一个高性能、高可...

天天顺利
2015/06/09
0
0
最全最强解析:支付宝钱包系统架构内部剖析(架构图)

支付宝系统架构概况 典型处理默认 资金处理平台 财务会计 支付清算 核算中心 交易 柔性事务 支付宝的开源分布式消息中间件–Metamorphosis(MetaQ) Metamorphosis (MetaQ) 是一个高性能、高可...

天天顺利
2015/06/09
0
0
.Net Core开源通讯组件 SmartRoute(服务即集群)

SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置即可实现服务通讯集群。SmartRoute是通过消息订阅的机制实现服务与服务之间的通讯...

泥水佬
2016/11/08
99
0

没有更多内容

加载失败,请刷新页面

加载更多

slot分发内容

slot元素作为组件模板之中的内容分发插槽。这个元素自身将被替换。 有 name 特性的 slot 称为具名 slot。 有 slot 特性的内容将分发到名字相匹配的具名 slot。 内容分发就是指混合父组件的内...

Carbenson
12分钟前
1
0
python开发入门

1.执行python文件 # python ./demo.py 2.Python ImportError: No module named 'requests'异常 解决方法: # pip install requests;...

硅谷课堂
13分钟前
1
0
官宣,PyTorch 1.0 稳定版本现已推出

简评:快来一起快乐地学习吧。 随着 PyTorch 生态系统和社区继续为开发人员提供有趣的新项目和教育资源,今天(12 月 7日)在 NeurIPS 会议上发布了 PyTorch 1.0 稳定版。研究人员和工程师现...

极光推送
26分钟前
1
0
对比理解adr,ldr指令

很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。 参照韦老师的代码和Makefile写了test_adr.S: .text .globl _start _start...

天王盖地虎626
37分钟前
2
0
将spring boot 项目注册为Linux的服务

springboot 注册为Linux系统服务 springboot 注册为Linux系统服务

miaojiangmin
39分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部