.NET Core使用IO合并技巧轻松实现千万级消息推送

之前讲述过多路复用实现单服百万级别RPS吞吐,但在文中有一点是没有说的就是消息IO合并,如果缺少了消息IO合并即使怎样多路复用也很难达到百万级别的请求响毕竟所有应用层面的网络IO读写都是非常损耗性能的(需要硬件配置很高的服务器)。这一章主要讲述的是IO合并的应用,并通过这个特性实现普通单服务千万级别的消息推送测试。

什么是消息IO合并

所谓的消息IO合并即是由原来一个消息对应一个网络读写设计成多个消息共享一个网络读写。那这样的设计到底会带来多大的性能提升,最简单的对比场就是每次执行1条SQL执行1万次和直接批执行1万条SQL的差别,相信做过的朋友一定非常清楚其性能提升的幅度。那在网络通讯中如何设计才能让多个消息进行IO合并呢?作者在实际实践中的方式有两种:1)通过定时器把队列中的所有消息定期合并发送,2)通过一个状态机归递消息队列,一旦队列存在消息一次过合并发送。定时器这种比较损耗性能,在连接量大的情况存在延时间相互影响;对于后者则比较好控制很多也不存在延时性,原理发送消息进队列后和网络发送完成再回到状态机检测消息队列状态即可。 640?wx_fmt=png

消息推送相对于请求响应来说相还是简单很多的,毕竟消息推送是单向并不需要有高效的响应机制。不过对于普通服务器间实现千万级的消息推送还是需要做些规划,毕竟是需要在有限的IO读写量的情况来达到这么大规模的消息处理。还有这么大量的消息序列化和反序列化也是一非常损耗性能的事情,所以这次实践并没有使用Protobuf,而是采用自定义序列化。测试的通讯组件选择Beetlex因为它具备了自动消息合并能力,并配合高效的多复路用机制在服务之间进行千万级别的消息推变得简单。

测试简述

这一次测试主要是向服务端推着一个简单的订单信息,由客户每次生成不同的订单信息推送给服务端,服务器接收订单消息后进行统计,并计算每秒接收的订单数量。

消息结构

640?wx_fmt=png

创建订单

640?wx_fmt=png

基于测试资源有限,这次的测试并没像之前跑PRS那样采用Protobuf,因为这量的对象处理量实在太大,测试的硬件环境不变所以采了自定义的序列化方式,具体可以参考源代码。

接收端代码

640?wx_fmt=png

由于是接收推送的消息,服务端接收消息后统计相关数量即可完成,对于之前的RPS测试所需处理的东西就少很多了。

推送端压测代码

640?wx_fmt=png

为了防止压爆连接内部的消息队列,压测端当连接队列超过2000个消息的时候停止一下。由于采用了消息合并机制所以并不需要太多连接,在整个测试过程中开启了三个压测实例,每个实例使用5个连接,换句话说BeetleX通过15个连接,实现千万级消息的推送能力。

测试服务器资源

这次测试使用了两家云服务器,第一家名字就不说了,开启了V16核的虚拟服务器,内部带宽6G和100万pps,结果实际压测2G带宽就压不上去了,刚开始以为是linux系统要配置问题,换了windows系统试一下还是不行……,最终还是换回了阿里云测,在v12核的虚拟服务器上顺利完成了这一次测试。

服务端: v12核,24G内存,操作系统ubuntu16.04 一台,内网最大带宽4Gb.

压测端: v12核,24G内存,操作系统ubuntu16.04,内网最大带宽4Gb, 两台(主要测试方式有些暴力一台无法达到压测目标)

测试结果

二台压测机共开启了3个实例,每个实例5个连接,每个连接应用层处理的buffer 32k;整个测结果消息推送量达到了1000万个/秒。服务端记录接收IO每秒15000次,平均每次receive得到的消息大概在600个左右。以下是测试情况的截图:

服务程序统计情况

640?wx_fmt=png

服务端CPU情况

640?wx_fmt=png

网络使用情况

640?wx_fmt=png

640?wx_fmt=png

下功测试代码: https://github.com/IKende/BeetleX/blob/master/samples/MassiveMessagepush.zip

原文地址https://www.cnblogs.com/smark/p/9869384.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天气情况图像分类练习赛 第三阶段(赛中感)

第三阶段也是实战阶段,不同于前两个阶段的填空而是实打实的预测分析 题目会给出8000张照片数据,其中6000作为训练集而另外2000张作位测试集,通过对6000张的训练来预测2000的结果,并将结果输出到csv文件中,提交检验成功…

一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相

在我们 2015 年开始的从 .NET Framework 向 .NET Core 迁移的工程中,遇到的最大的坑就是标题中所说的——同步方法中调用异步方法发生”死锁”。虽然在 .NET Framework 时代就知道不能在同步方法中调用异步方法,但我们却明知路有坑,偏向此路行…

take

take 题解参考 题目描述 Kanade has n boxes , the i-th box has p[i] probability to have an diamond of d[i] size. At the beginning , Kanade has a diamond of 0 size. She will open the boxes from 1-st to n-th. When she open a box,if there is a diamond in it an…

将传统 ASP.NET 应用迁移到 .NET Core

点击蓝字关注我现在越来越多的人在谈论. NET Core。诚然,.NET Core 是未来, 但是.NET Framework 仍在支持, 因为大量的应用程序无法在短时间内迁移。.NET Core 和 .NET Framework 就像电动汽车和汽油动力汽车。汽油车是成熟的,你可以毫无任何问题驾驶它&…

[翻译] 初看 ASP.NET Core 3.0 即将到来的变化

原文: A first look at changes coming in ASP.NET Core 3.0在我们努力完成下一个 minor 版本的 ASP.NET Core 的同时,我们也在对下一个 major 版本进行更新,其中包括如何使用框架组合项目、更紧密的 .NET Core 集成以及第三方开源集成,所有这…

aspnet core 2.1中使用jwt从原理到精通二

在aspnet core中,自定义jwt管道验证有了上一节的内容作为基础,那这点也是非常容易的,关键点在中间件,只是把上一级在测试类中的自定义验证放到中间件中来即可,不过需要注意:中间件 的位置很重要&#xff0c…

CentOS开发ASP.NET Core入门教程

因为之前一直没怎么玩过CentOS,大多数时间都是使用Win10进行开发,然后程序都部署在Window Server2008或者Window Server2012上!因此想尝试下Linux系统。最后经过选型选了比较流行的CentOS系统。正好,今晚要加班,所以在…

工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关闭所使用的 tcp 连接,而是将 tcp 连接置为 TIME_WAIT 状态,240秒(4…

ASP.NET Core2读写InfluxDB时序数据库

在我们很多应用中会遇到有一种基于一系列时间的数据需要处理,通过时间的顺序可以将这些数据点连成线,再通过数据统计后可以做成多纬度的报表,也可通过机器学习来实现数据的预测告警。而时序数据库就是用于存放管理这种有着时间顺序数据的&…

Nature 新研究发布,GPT 驱动的机器人化学家能够自行设计和进行实验,这对科研意味着什么?

文章目录 前言揭秘Coscientist不到四分钟,设计并改进了程序能力越大,责任越大 前言 有消息称,AI 大模型 “化学家” 登 Nature 能够自制阿司匹林、对乙酰氨基酚、布洛芬,甚至连复杂的钯催化交叉偶联反应,也能完成。 …

SmartCode 常见问题

SmartCode 能干什么?SmartCode IDataSource -> IBuildTask -> IOutput > Build EverythingSmartCode的执行流是 数据源->构建任务->输出,也就是说应用场景非常广泛。从DB读取数据结构,最终生成整个解决方案代码生成器&#x…

全面支持开源,微软加速 Visual Studio 和 Azure DevOps 云升级

在 2018 微软技术暨生态大会(Microsoft Tech Summit)上,微软宣布围绕 Visual Studio 和 Visual Studio Code 开发平台提供一系列新功能与服务,并对 Azure DevOps 研发云进行整合升级,通过 Visual Studio 开发平台与微软…

HttpClient参观记:.net core 2.2 对HttpClient到底做了什么?

.net core 于 10月17日发布了 ASP.NET Core 2.2.0 -preview3,在这个版本中,我看到了一个很让我惊喜的新特性:HTTP Client Performance Improvements ,而且在Linux上性能提升了60% !之前就一直苦于 HttpClient 的糟糕特性&#xff…

后缀数组(讲解)

子串:从原串中选取连续的一段,即子串 空串也是子串 后缀:suf(k)为s(k…n)构成的子串 任何子串都是某个后缀的前缀 最长公共前缀 lcp(suf(i),suf(j)) 问题: 将所有后缀suf(1),suf(2),suf(N)按照字典序从小到大排序 暴力sort N2 …

2018 上海.NET职位围观报告

我一直说我是夏眠动物,如今已经11月份了,差不多也该活过来了,所以我决定写篇文章给各位.NET的支持者们和公司打打气,也算是为社区做点贡献吧。我最近主要干了两件事:让NPOI支持.NET Core,现已发布2.4版本。…

老张 .NetCore与Vue 框架学习

缘起作为一个.Net攻城狮已经4年有余了,一直不温不火,正好近来项目不是很忙,闲得无聊,搞一搞新技术,一方面是打发无聊的时间,一方面也是督促自己该学习辣!身边的大神都转行的转行,加薪…

2018年10月28日宁波dotnet社区活动回顾及下次活动预告

离上次活动,有半年了,汗。之后尽量保证每月一次,以组织为主,多邀请嘉宾来分享。本次活动不足之处人手不足:由于活动组织事项受限于人手(目前就我一个,这次活动前后我又应邀给大红鹰学院应届生介…

[JSOI2007]字符加密

题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。 例如‘JSOI07’,可以读作&…

BotSharp v0.2 发布, 支持微信智能回复

BotSharp v0.2 主要是针对微信的消息平台做整合,让.NET开发者可以轻松的搭建基于NLU自然语言理解的智能回复功能,BotSharp.Channel.Weixin模块负责和微信的公众号平台对接,接收消息通知,并能消息产生智能回复,回复的内…

P2852 [USACO06DEC]Milk Patterns G

题目描述 Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation, he discovered that although he can’t predict the quality of milk from one day to the next, there are some regular patterns in th…