nmq消息队列解析
消息中间件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消息队列解析的更多相关文章
- MQ(消息队列)常见的应用场景解析
前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...
- 剖析nsq消息队列(二) 去中心化代码源码解析
在上一篇帖子剖析nsq消息队列(一) 简介及去中心化实现原理中,我介绍了nsq的两种使用方式,一种是直接连接,还有一种是通过nslookup来实现去中心化的方式使用,并大概说了一下实现原理,没有什么难 ...
- rabbitMQ消息队列 – Message方法解析
消息的创建由AMQPMessage对象来创建$message = new AMQPMessage("消息内容");是不是很简单. 后边是一个数组.可以对消息进行一些特殊配置$mes ...
- [源码解析] 消息队列 Kombu 之 基本架构
[源码解析] 消息队列 Kombu 之 基本架构 目录 [源码解析] 消息队列 Kombu 之 基本架构 0x00 摘要 0x01 AMQP 1.1 基本概念 1.2 工作过程 0x02 Poll系列 ...
- 消息队列1:RabbitMQ解析并基于Springboot实战
RabbitMQ简介 AMQP:Advanced Message Queue,高级消息队列协议.它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产 ...
- 阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)
一.谈谈你对 MyBatis 的理解? 1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动.创建连接.创建 ...
- 消息队列高手课,带你从源码角度全面解析MQ的设计与实现
消息队列中间件的使用并不复杂,但如果你对消息队列不熟悉,很难构建出健壮.稳定并且高性能的企业级系统,你会面临很多实际问题: 如何选择最适合系统的消息队列产品? 如何保证消息不重复.不丢失? 如果你掌握 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- python之消息队列
引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题.消息服务擅 ...
随机推荐
- JSON字符串和JS对象之间的转换
JSON字符串和JS对象之间的转换 1 json字符串转换为js对象 1.1 标准json格式字符串转换为Js对象 JSON字符串 str JSON.parse(str) eval(str) eva ...
- HTMl5的存储方式sessionStorage和localStorage详解
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage.sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...
- codevs 3288 积木大赛
题目描述 Description 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第i块积木的最终高度 ...
- [板子]ISAP
ISAP求最大流,敲了一发板子,无压行,教程略去.转载请随意. #include <cstdio> #include <cstring> #include <algori ...
- cosbench 压测RGW生产环境
配置信息: 使用 2个万兆网卡的RGW主机,并用OSPF做高可用和负载均衡. Ceph OSD集群 有21Node (万兆网卡+ 12个4T SATA机械硬盘) 测试VM配置: 使用在使用VXLA ...
- [翻译] V8引擎的解析
原文:Parsing in V8 explained 本文档介绍了 V8 引擎是如何解析 JavaScript 源代码的,以及我们将改进它的计划. 动机 我们有个解析器和一个更快的预解析器(~2x), ...
- Ubuntu 上搭建 Samba 服务器
由于经常要接收同事发送的一些文件,U盘拷来拷去的很麻烦. 在本机Ubuntu上搭了各Samba服务器,过程中遇到点小问题,记录一下 sudo apt-get install samba 创建一个共享目 ...
- vi学习总结
1.模式 命令行模式:光标的移动.内容删除移动复制操作 插入模式:文字输入,即编辑状态 底行模式:文件保存或退出vi,设置编辑环境 2.基本操作 vi myfile,输入vi 文件名,,则进入vi. ...
- 【Android群英传】学习笔记(一)
本系列博客为笔者在学习<Android群英传>的学习总结 Android相关工具镜像连接:http://www.androiddevtools.cn/ Dalvik与ART Dalvik包 ...
- php 使用函数中遇到的坑之----list
1. list 把数组中的值赋给一些变量 <?php $info = array('coffee', 'brown', 'caffeine'); // 列出所有变量 list($drink, $ ...