常用的通知机制中比较典型的有以下几种:

1、signal — zeromq 唤醒线程
这种机制下,我们向被通知进程发送一个特殊的signal(比如SIGUSR1),这样正在睡眠的读进程就会被信号中断,然后醒来。
该方法的优点是:读进程不需要监听一个额外的eventfd,适合一些不方便使用eventfd的场景;另外,用户可以选择是使用实时信号(SIGRTMIN+1),还是使用非实时信号(SIGUSR1)。
该方法的缺点是:通知不实时。因为信号的检查只有在中断返回的时候才会进行,这个时间跟操作系统的HZ、jiffies有关。

2、socket — nginx socketpair
这种机制下,写进程往socket(domain socket)写一个字符,然后读进程通过epoll/select/poll得到数据到达的通知。

3、fifo
这种机制跟socket类似,写进程往fifo中写一个字符,然后读进程通过epoll/select/poll得到数据到达的通知。

4、pipe ----- 占用两个文件描述符
跟2、3差不多。

5、eventfd/signalfd — 不像pipe一样需要两个描述符,它只需要一个描述就可以实现进程间通信了。

跟前面差不多,不过是内核帮我们事先fifo、signal通知,只有比较新的内核版本才支持。这种方式存在的问题是需要在不同进程间传递句柄,非fork方式实现比较复杂。

上面这几种方式的共性是都需要陷入内核,被通知进程只有在内核态才能接收通知,对于处理性能要求高的场景,应该少用通知。
所以,当然就看业务场景发送通知的开销是不是很大了。如果请求量很大,读进程一直忙于处理,不会频繁触发通知,那就很合适了。

服务端设计方案

1、首先主进程根据机器CPU个数,创建对应数量的管道;
2、创建完对应的管道之后,再创建一样数量的线程,每个线程绑定一个CPU;
3、主进程开始初始化socket,然后accept,当接收到一个客户端连接时,就把conn_fd写到某个pipe中;
3、每个线程创建epoll,然后监听对应pipe的写端fd,当监听到pipe中有数据时,就读取该数据,格式化为fd,将该fd加入epoll进行监听。

memcached 实现方案


主线程和工作线程共享着pipe,主线程负责监听listenfd,当有客户端到来时,将clientfd封装成MSG_ITEM,放入消息队列,然后给管道写入一个字符。子线程是负责监听各个clientfd,也在一个libevent事件循环中,这时管道读端提醒可读事件,然后回调函数就去读取消息队列的MSG_ITEM,取出clientfd,放入libevent监听中~

参考:

https://www.cnblogs.com/i4oolish/p/3970402.html
https://www.cnblogs.com/i4oolish/p/3971322.html

高并发消息队列常用通知机制相关推荐

  1. java队列处理高并发_Java高并发--消息队列

    Java高并发--消息队列 举个例子:在购物商城下单后,希望购买者能收到短信或者邮件通知.有一种做法时在下单逻辑执行后调用短信发送的API,如果此时服务器响应较慢.短信客户端出现问题等诸多原因购买者不 ...

  2. 使用kafka消息队列中间件实现跨进程,跨服务器的高并发消息通讯

    作者 | 陈屹       责编 | 欧阳姝黎 近来工作上接收到一项任务,实现c++后台服务器程序,要求它能承载千万级别的DAU读写请求.目前实现千万级高并发海量数据请求的服务器设计在"套路 ...

  3. 腾讯云分布式高可靠消息队列 CMQ 架构

    在分布式大行其道的今天,我们在系统内部.平台之间广泛运用消息中间件进行数据交换及解耦.CMQ 是腾讯云内部自研基于的高可靠.强一致.可扩展分 布式消息队列,在腾讯内部包括微信手机 QQ 业务红包.腾讯 ...

  4. POSIX消息队列信号通知

    2019独角兽企业重金招聘Python工程师标准>>> 相比于System V消息队列的问题之一是无法通知一个进程何时在某个队列中放置了一个消息,POSIX消息队列允许异步事件通知( ...

  5. Golang 高性能高可用消息队列框架go-nsq使用

    为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯.一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golan ...

  6. 高并发缓存队列防止溢出解决方案

    目录 1 背景介绍 1.1 设计分析微信抢红包 1.2 红包定时导入缓存队列 2 队列术限流 2.1 高并发场景分析 2.2 队列削峰实战 3 设计原则 3.1 动静分离 3.2 微服务化 3.3 负 ...

  7. 超强图文|并发编程【等待/通知机制】就是这个feel~

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If ...

  8. 实力分享,聚焦分布式高可用消息队列

    消息队列(Message Queue),是分布式系统中非常重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息 ...

  9. 高并发多队列网卡设置CPU亲和性项目记录

    之前我转载过一篇smp-affinity的文章https://blog.csdn.net/yue530tomtom/article/details/76216503 实例 做ssl加速卡(高并发)测试 ...

  10. 腾讯云分布式高可靠消息队列CMQ架构

    针对金融.交易.订单等对可靠性.可用性有较高要求的业务场景,本文分享如何通过CMQ消息队列实现高可用架构 作者:张浩         出处:腾云阁文章 ---------------------- 在 ...

最新文章

  1. 常见Jvm面试题总结及答案整理 120道(持续更新)
  2. 引进博士:118万安家房补+18万经费;硕士:42万安家房补+10万经费
  3. 如何实现一个连接池?一文带你深入浅出,彻底搞懂!
  4. 协程 coroutine
  5. 【java】人脸识别 虹软ArcFace 2.0-抽取人脸特征并做比对
  6. 不要讨厌HATEOAS Part Deux:HATEOAS的春天
  7. python距离向量路由算法_路由算法(全网最细)
  8. SQL注入攻击及防范
  9. iBatis.Net(6):Data Map(深入)
  10. mysql 索引使用不当_MySQL笔记:select默认使用不当索引导致的巨大性能损失问题_MySQL...
  11. 数据结构严蔚敏算法设计习题解答(逐渐更新)(更新于2020.11.20)
  12. asp木马伪装成图片或其它,上传漏洞终极解决方法
  13. 图像匹配几种常见算法与实践
  14. Python UI自动化 编程(一) UIAutomation
  15. OPENCV函数介绍:normalize()
  16. 推荐一款特别厉害的在线工具,程序员的百宝箱
  17. 通过bitmap改变图片的大小
  18. 如何在 Mac 上打开“查找”?
  19. 不懂SEO?一篇文章带你精通SEO优化
  20. 我国在计算机科学领域故事,封面故事 | 张黔: 计算机世界的巾帼英姿

热门文章

  1. 1006 换个格式输出整数 (15 分)—PAT (Basic Level) Practice (中文)
  2. 软件设计精要与模式(第2版)
  3. (BUG记录)使用迭代器安全的删除处于循环下集合中的元素
  4. bzoj4552[HEOI2016/TJOI2016]排序(二分+线段树)
  5. 软工网络15个人阅读作业1
  6. Activity生命周期的回调,你应该知道得很多其它!--Android源代码剖析(下)
  7. 20145302张薇 《信息安全系统设计基础》第0周学习总结
  8. HCIE-Security Day7:6个实验理解目的NAT
  9. 游戏筑基开发之单链表及其增删改查(C语言)
  10. Linux之mariadb数据库