NMQ消息队列—中间件
转自:http://www.cnblogs.com/lushilin/p/6209976.html(鲁仕林)
消息中间件NMQ
1.What is nmq?
nmq = new message queue;
一个通用消息队列系统
为在线服务设计
什么是消息队列?问什么需要?有哪些功能?
消息队列的本质:1.多个不同的应用之间实现相互通信的一种异步传输模式2.异步3.解耦
业界有哪些比较好的mq?
yahoo YMB 、twitter Kestrel、amazon SQS、apache kafka
百度的nmq和bigpipe
那么为什么会有这么多的实现呢?
影响设计的关键需求:
1.数据安全性
2.传输实时性
3.时序需求
4.吞吐需求
5.消费方形态
6.消息关联形态
现在介绍一下百度的nmq(看一下nmq的设计考量):
1.项目起源于大社区
2.重复开发、分散运维;极大的人力浪费;
并发+时序的难点,让rd头疼
核心+单点的运维,让op蛋疼
3.架构的发展,让老的系统不在适合
4.业务的发展,对性能、可扩展性有了更高的要求;
mq的本质需求:
1.数据安全性————》其实还好
2.传输实时性————》要求很高
3.吞吐需求————》很大
4.时序需求————》真的需要
5.消费方形态————》多样
6.消息关联形态————》1vN
nmq的其他需求:
1.集中运维
2.解耦
3.运维平台化、自动化
4.完善的功能,强大的时序+并发控制
5.支持国际化数据互通
模型设计(第一个问题)
nmq是基于消息的队列,还是基于消费者的队列
考虑点:
1.存储容量
2.运维便利度
3.扩展性
4.开发成本
所以最终选择应该基于消息本身。
模型设计(第二个问题):
1.推或者拉
2.核心问题:谁维护信息?
为了更加深入的对“推”和“拉”这两种模式进行对比,可以将consumer分为2类:
1.竞争模式:一个consumer模块部署很多机器,但所有机器竞争消费同一份消息。
2.多主模式:一个consumer模块部署很多机器,每个机器都消费全量消息。
推模型的分析:
1.推模型是消息集中管理方式,消息队列知道consumer的一切。
2.可以支持2种consumer模式,容易实现各种策略。
3.优点是灵活,什么都可以做
4.缺点是耦合,消息队列本身的运维是问题
拉模式分析
1.对多主的consumer:完美
消息队列只负责消息的存储和查询
运维便利、架构清晰、简单
2.对竞争的consumer:难以支持
两种模式的选择
1.竞争模式会是我们今后的主流模式和大趋势;
数据逻辑层和存储引擎层的分离
数据的拆分和冗余,都会在存储引擎层实现
2.PHP模块实现“拉”有一定的难度
3.实现策略的灵活性和重要,推模式有天然的优势
4.拉模式,会带来更大的迁移代价
5.最终选择“推”模式
消息标识:
1.msg = product+topic+cmd
2.product产品线标识
3.topic
按业务划分的消息序列,逻辑上的概念,可小可大。
nmq只保证相同的topic内的命令时序
4.cmd消息类别的最终标识,不同topic之间可以同名
模型:
1.proxy
消息唯一入口,以topic为单位消息分流
2.topic-server(ts)
消息存储。级联和备份
3.pusher
消息发送,协议可扩展
nmq集群图片:
nmq的扩展性设计:
1.垂直扩展
当接收同一个topic的consumer增多,导致pusher出现性能瓶颈。
可以通过ts级联扩展多个pusher解决,支持多级级联
2.水平扩展
当一个topic的命令增多,导致超过单机ts性能极限
可以通过将该topic拆分到多个ts解决;比如按照某个partition key进行拆分;拆分后,只有相同pk的消息才能保证时序。
运维设计
1.队列的存储粒度
一个ts内部的所有topic串行存储于一个队列中,共享一维transid;
牺牲性能换取简单,易运维
2.主从同步和切换
ts级联和备份合一;slave主动从master拉数据,配合资源定位,简化主从切换步骤。
异步pipeline模式,强吞吐,支持跨机房。
并发+时序
1.一发一答的串行更新模式远不能满足更新性能的需求
2.在并发的前提下,可以做到按照某个key的时需保证;
具有相同key的消息,可以保证时序
比如接贴吧发帖的命令的consumer,可以通过配置做到不同发帖更新并发,但保证同一个吧的发帖是有序串行的;
3.实现
正在发送窗口+待发送窗口
发送先前check是否有互斥的消息正在发送
国内跨城市方案:
国际化数据互通方案:
NMQ消息队列—中间件相关推荐
- rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...
概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...
- 消息中间件系列(七):如何从0到1设计一个消息队列中间件
消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...
- 使用kafka消息队列中间件实现跨进程,跨服务器的高并发消息通讯
作者 | 陈屹 责编 | 欧阳姝黎 近来工作上接收到一项任务,实现c++后台服务器程序,要求它能承载千万级别的DAU读写请求.目前实现千万级高并发海量数据请求的服务器设计在"套路 ...
- c#开源消息队列中间件EQueue 教程
一.简介 EQueue是一个参照RocketMQ实现的开源消息队列中间件,具体可以参看作者的文章<分享一个c#写的开源分布式消息队列equeue>.项目开源地址:https://githu ...
- ActiveMQ RabbitMQ RokcetMQ Kafka实战 消息队列中间件视频教程
附上消息队列中间件百度网盘连接: 链接: https://pan.baidu.com/s/1FFZQ5w17e1TlLDSF7yhzmA 密码: hr63 转载于:https://www.cnblog ...
- 基于硬件的消息队列中间件 Solace 简介之二
小短篇介绍关于Solace https://blog.csdn.net/aqudgv83/article/details/79495489 . 前面简单介绍了Solace来自于哪家公司, 主要能做哪些 ...
- MQ消息队列中间件:
MQ消息队列中间件: 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应. 异步通讯:就像发信息,不需要马上回复. 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: ...
- 消息队列中间件 Message Queue 简称:MQ
一.什么是消息队列? 消息队列,一般我们会简称它为MQ(Message Queue) 队列是一种先进先出的数据结构. 现有常用的开源消息中间件有Kafka.CMQ.JBoss Messaging.JO ...
- 浅谈消息队列及常见的分布式消息队列中间件
背景 分布式消息队列中间件是是大型分布式系统不可缺少的中间件,通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息.所以消息队列主要解决应用耦合.异步消 ...
最新文章
- 《CLR Via C# 第3版》笔记之(二) - 响应文件
- Fedora20下安装VLC
- mysql慢查询日志时间戳_Mysql查询在时间戳的日期范围内非常慢
- 视频编解码器 2020-比赛开始!
- OpenStack创建win7实例遇到的问题(尚未解决,求帮助)
- Linux CentOS完全卸载PHP
- C# WinForm开发系列
- 15. Provide access to raw resources in resouce-managing classes
- 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_17maven工程运行环境修改...
- 如果数组的值都一样java_java – 将数组中的相同值合并在一起
- elasticsearch6.1.3 集成分词器
- 数字电子钟设计(基于quartus软件)
- 小米笔记本linux指纹,小米笔记本Air13.3寸指纹版(128GB) u盘装系统win10步骤
- BP神经网络算法 原理讲解以及底层代码复现
- 【丢不掉的爱好-Android01】兜兜转转
- Python爬虫学习笔记
- Github Actions Self-Hosted 本地运行Actions
- 聊天窗口怎么用计算机,在电脑上用键盘快速打开聊天窗口的快速键是什么键?...
- 神经网络学习(3)————BP神经网络以及python实现
- 阿里云实时计算产品经理李佳林:基于 Flink 构建大规模风控系统的技术实战
热门文章
- 关于在线评论有用性的论文研读笔记---41-50篇
- 用 Vue 改造 Bootstrap,渐进提升项目框架[转]
- 查看HDFS文件系统数据的三种方法
- yolov5l.pt下载
- CT值以及窗宽窗位(未完待续)
- python arcade库_python游戏库:Arcade教程(4)
- 递归实现n阶螺旋矩阵问题
- 【已解决】Java保存数据超时失败 ClickHouse exception, code 1002, 8123 failed to respon,keep_alive_timeout参数
- java多线程累加计数
- matlab最基础教程(六):编程习惯