zz[C++]合理的设计和使用消息队列
http://www.cnblogs.com/egmkang/archive/2012/11/17/2763295.html
生产者消费者问题,是永远的经典.
单纯让多个线程去竞争,占有资源然后处理,会让系统的复杂度变得相当复杂,并且整个系统的并发也很难控制.为了让系统简单化,流畅化,引入消息队列,而且这样,系统更具有相当高的吞吐量.因为做的事情简单而有效.
根据具体业务的不同,个人(认为)把消息队列分为1:1模型,还有就是N:M模型的.
如果消费者的消费能力非常高.个人认为就应该使用1:1的队列.这种队列足够简单,可以进行各种优化,比如避免动态内存分配,锁优化,使用lock-free等.这样可以让主循环的等待时间降到最低,使其可以专心致志进行各种逻辑处理.
有时,有些业务逻辑,不是很在乎时许,允许比较小的时间误差,而且消费能力很强的化,也是可以使用1:1的队列,不过生产者变成了n个,消费者还是一个.:-D 当然这种场景,不是非常多.
这边给出一个lock free的message queue.
如果消费者的消费能力比较差,还有一些业务,比如金钱相关的,比如数据库存档相关的,而且这样的系统,想要提高吞吐量,就只能使用N:M的模型.只不过这边把lock-free换成了mutex,虽然mutex有可能会陷入到内核,不过只要临界区足够小,操作足够轻量级,效率还是蛮高的.一般的系统,都不会在这边有瓶颈.
这边给出一个blocking queue的实现.
| 消费速度\时序 | 关心 | 不关心 |
| 消费速度慢 | blocking | blocking |
| 消费速度快 |
1:1 lock free N:M blcoking |
lock free |
其实很多业务,1:1的就足够快了.
PS: 其实N:M的lock free queue也是可以实现的,不过需要用到cas. fecth and add使不能实现n个并发的.另外,cas实现消息队列的复杂性相当高,收益也不是非常有效(在CPU核数较多的情况下),故放弃了实现多并发的lock free队列.
另外不关心时序,不是意味着一点都不关心,而是允许有一定的误差,比如10ms.
本来还想贴代码,想想算了,代码在github上开源了,可以自己去看实现.
https://github.com/egmkang/green_turtle/blob/master/green_turtle/blocking_queue.h
https://github.com/egmkang/green_turtle/blob/master/green_turtle/message_queue.h
zz[C++]合理的设计和使用消息队列的更多相关文章
- 如何从0到1设计一个MQ消息队列
消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...
- Python 番外 消息队列设计精要
消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的Active ...
- ActiveMQ学习总结(8)——消息队列设计精要
消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一. 当今市面上有很多主流的消息中间件,如老牌的Activ ...
- 消息队列高手课,带你从源码角度全面解析MQ的设计与实现
消息队列中间件的使用并不复杂,但如果你对消息队列不熟悉,很难构建出健壮.稳定并且高性能的企业级系统,你会面临很多实际问题: 如何选择最适合系统的消息队列产品? 如何保证消息不重复.不丢失? 如果你掌握 ...
- nmq消息队列解析
消息中间件NMQ 1.What is nmq? nmq = new message queue; 一个通用消息队列系统 为在线服务设计 什么是消息队列?问什么需要?有哪些功能? 消息队列的本质:1.多 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
- ENode 1.0 - 消息队列的设计思路
开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architec ...
- enode框架step by step之消息队列的设计思路
enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...
- 基于redis的延迟消息队列设计
需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...
随机推荐
- UnSupported Encoding错误
学习struts2的时候碰到tomcat报错:org.apache.jasper.JasperException: Unsupported encoding: UTF-8,原因是jsp文件中的pag ...
- Python变量和数据类型
十六进制用0x前缀和0-9 a-f表示 字符串是以''或""括起来的任意文本 一个布尔值只有True和False两种值 布尔值可以用and or not运算 空值是 ...
- php 解决乱码的通用方法
一,出现乱码的原因分析 1,保存文件时候,文件有自己的文件编码,就是汉字,或者其他国语言,以什么编码来存储 2,输出的时候,要给内容指定编码,如以网页的形势输入时<meta http-equiv ...
- Blog透视镜
Blog透视镜,提供了Blog代码示例,文章和教程,可以帮助你建置博客. 网站名称:Blog透视镜 网站地址:http://blog.openyu.org
- python list列表 方法总结
深入链表(most on lists) The list data type has some more methods. Here are all of the methods of list ob ...
- SDL显示内存中的图像
<textarea readonly="readonly" name="code" class="c++"> #include ...
- Jquery之家5个顶级Material Design框架
谷歌Material Design在如今的前端页面设计中非常流行.Material Design的设计风格向我们展示了一个简单而有内涵的现代UI设计方案. Material Design是如此的简洁美 ...
- 怎样使用LaTeX输入葡萄牙语等语言中的特殊字符
论文中引用了大名鼎鼎ER random graph model,但是这两位的名字不太好打,发现Google Scholar中直接下载的bib文件中也是错的.找了一会,发现转义字符已经定义得很好了.只是 ...
- Java安装根目录
bin存放了Java的操作工具,比如编译工具javac.启动JVM的Java等 db存放了Java测试的数据库Derby,企业不用 include存放C++的头文件 jre运行环境,里面有JVM li ...
- 计算机管理cmd命令行
给你一个资料,想必对你来讲有保存价值: 开始菜单中的“运行”是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows的大部分程序,熟练的运用它,将给我们的操作带来诸多便捷. winver ...