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分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...
随机推荐
- Struts2中的校验框架
Struts2提供的客户端校验 尽管这种支持比较弱,但采用Struts2中的客户端校验时需要注意以下几点 1..将<s:form validate="true">的va ...
- OpenCV——Haar-like特征
Haar-like特征--即Haar特征,是计算机视觉领域一种常用的特征描述算子.它最早用于人脸描述. 目前常用的Haar-like特征可以分为以下几类:线性特征.边缘特征.点特征(中心特征).对角线 ...
- Mysql常用命令和常用函数
函数 : FROM_UNIXTIME(unix_timestamp,format) 时间戳转字符串日期格式 格式化规则如下 %M 月名字(January……December) %W 星期名字(Sun ...
- css使用技巧
1) 网站上经常会出现用户输入一大段字符和字母以至于文字无法正常折行,把版式破坏,这样我们就要参考以下样式:word-wrap:break-word; overflow:hidden; 当然必须得有宽 ...
- djangoPOST请求403 forbidden
处理过程 网上搜索修改setting.py,在MIDDLEWARE_CLASSES增加django.middleware.csrf.CsrfResponseMiddleware 没能解决问题 有说在 ...
- Parallel并行编程
Parallel并行编程 Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工 ...
- MySQL--query-cache
知识准备: 1.mysql 的query-cache是什么? mysql可以把执行完成的select 语句和这个select 语句对应的结果集缓存起来:下次再用调用相同的select 语句时就直接返 ...
- 串口WIF简单调试
/*********************************************************************** Title:Wifi串口调试 Hardware: Wi ...
- [分享]我的LABVIEW快速开发串口测试软件实例
LABVIEW是美国国家仪器公司(National Instruments,简称NI)的创新产品,它允许编程人员使用图形方式来进行编程,摒弃了艰涩难懂的代码,只需要拖动相应图形控件然后连线,进行简单的 ...
- Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)
简述 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP ...