消息中间件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消息队列解析的更多相关文章

  1. MQ(消息队列)常见的应用场景解析

    前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...

  2. 剖析nsq消息队列(二) 去中心化代码源码解析

    在上一篇帖子剖析nsq消息队列(一) 简介及去中心化实现原理中,我介绍了nsq的两种使用方式,一种是直接连接,还有一种是通过nslookup来实现去中心化的方式使用,并大概说了一下实现原理,没有什么难 ...

  3. rabbitMQ消息队列 – Message方法解析

    消息的创建由AMQPMessage对象来创建$message = new AMQPMessage("消息内容");是不是很简单. 后边是一个数组.可以对消息进行一些特殊配置$mes ...

  4. [源码解析] 消息队列 Kombu 之 基本架构

    [源码解析] 消息队列 Kombu 之 基本架构 目录 [源码解析] 消息队列 Kombu 之 基本架构 0x00 摘要 0x01 AMQP 1.1 基本概念 1.2 工作过程 0x02 Poll系列 ...

  5. 消息队列1:RabbitMQ解析并基于Springboot实战

    RabbitMQ简介 AMQP:Advanced Message Queue,高级消息队列协议.它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产 ...

  6. 阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)

    一.谈谈你对 MyBatis 的理解? 1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动.创建连接.创建 ...

  7. 消息队列高手课,带你从源码角度全面解析MQ的设计与实现

    消息队列中间件的使用并不复杂,但如果你对消息队列不熟悉,很难构建出健壮.稳定并且高性能的企业级系统,你会面临很多实际问题: 如何选择最适合系统的消息队列产品? 如何保证消息不重复.不丢失? 如果你掌握 ...

  8. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  9. python之消息队列

    引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题.消息服务擅 ...

随机推荐

  1. IT人士怎样的休息方式才高效

    为什么你睡了11个小时仍然觉得疲累? 为什么你花了好几万去岛国度假并没有增加生活的热情? 都说要去KTV,去夜店,去游乐园就能忘掉不快,更带劲地开始新的一天,但是尽兴归来心里只剩空虚? 我们真的明白休 ...

  2. Android Studio导入github下载的project和module

    前言:我们以前eclispe时代, 经常都是跑到github浏览第三方开源资源,然后下载下来,运行一下sample之类的,学习没有接触的第三方安卓库,但是到了Android Studio,在githu ...

  3. HOLOLENS 扫描特效 及得出扫描结果(SurfacePlane)

    HOLOLENS 扫描特效 及得出扫描结果(SurfacePlane) 要求只扫出地板和墙, 由于地板和墙面积较大 扫描结果 HOLOTOOLKIT老版本点在参数调节PlaneFinding.Find ...

  4. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  5. ActiveMQ笔记(6):消息延时投递

    在开发业务系统时,某些业务场景需要消息定时发送或延时发送(类似:飞信的短信定时发送需求),这时候就需要用到activemq的消息延时投递,详细的文档可参考官网说明,本文只介绍二种常用的用法: 注:本文 ...

  6. [LeetCode] Sparse Matrix Multiplication 稀疏矩阵相乘

    Given two sparse matrices A and B, return the result of AB. You may assume that A's column number is ...

  7. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

  8. iOS开发小技巧 -- tableView-section圆角边框解决方案

    [iOS开发]tableView-section圆角边框解决方案 tableView圆角边框解决方案 iOS 7之前,图下圆角边框很容易设置 iOS 7之后,tableviewcell的风格不再是圆角 ...

  9. HAProxy的日志配置以及ACL规则实现负载均衡

    HAProxy配置日志策略 默认情况下,HAProxy是没有配置日志的在centos6.3下默认管理日志的是rsyslog,可以实现UDP日志的接收,将日志写入文件,写入数据库先检测rsyslog是否 ...

  10. Sql 2008 的常用函数

    1.LEN 函数:返回数据的长度 ') 返回:8 2.ASCII函数:返回字符串最左边的ascii值 SELECT ASCII('abc') 返回:97 3.LEFT函数:从左边开始截取指定长度的字符 ...