如何深入理解一套MQ消息中间件
怎样算是理解了一套MQ中间件呢?原来一知半解的我列了几个维度:demo跑起来,理解其投递次数的语义,理解其事务的特性等等。这是一种角度,但总有种看山不是山的一知半解的感觉。再问一层,比如为什么Kafka吞吐量远胜于其他中间件,为什么说适合日志采集和流式计算的场景?就回答不上来了。学习终归是个积累的过程。
直到某一天看到阿里一篇挺常规的关于Notify和MetaQ的介绍,却突然茅塞顿开。当然了,其中不乏是做了一两个需求的缘故。故事是围绕着一下几个疑问展开的。
1.什么是消息中间件,解决了什么问题?Message Queue嘛,顾名思义就是排队。打个比方去快餐店点餐,每个人点餐可能只要10s,但如果三个人同时向服务员点餐,服务员就可能会乱了,三个顾客还可能会吵起来,这件事就没法30s内解决,那么很简单,排队点餐就好办了。所以MQ最核心的功能就是削峰蓄洪。其他特征则是围绕这一功能衍生出来的,比如如何维持排队的人不乱套(持久化和重发和事务支持),如何容纳更多的人排队(堆积能力),如果实在接待不了这么多人怎样让后来的人去其他地方安置(限流机制)等等。
2.MetaQ与Kafka的对比。名字缘由是说Metamorphosis变形记是向卡夫卡致敬。明明Kafka性能远胜于MetaQ,为什么还要造出个MetaQ呢?因为支持了tag过滤了啊,过滤的特性放在电商系统里对性能的提升比单机的吞吐量和堆积能力还更重要。也就是说,MetaQ加入的是更场景化的特性。
3.MetaQ与ActiveMQ的对比。侧重谈前者,后者遵循AMQP协议。MetaQ串行化写盘快(随机读可以做内存缓存),pull拉式订阅解放了broker的路由压力,逻辑队列只存索引信息非常轻。这里解决的问题,是性能的问题,持久化时如何写得快而准、如何读得快,消息堆积时如何能堆更多,投递时如何又灵活又快又省资源(cpu和带宽)。
4.JMS与AMQP。JMS是java接口规范。AMQP是跨越语言的MQ标准,并规划了路由到投递的分层设计。
5.共性。投递次数的语义完全是共性,基本都是至少投递一次的语义,要支持至多投递一次并不难但是场景很少,要支持准确投递一次很难且代价太大,何不让应用自己去做接口幂等。事务则是取舍,能支持事务的都会牺牲一些性能,不支持事务的一般都会更轻快。广播等其他特性,要看具体的应用场景。
所以,如何深入学习一套MQ中间件?围绕其持久化的形式(kv或串行写盘等等)、堆积的能力(队列的底层数据结构)、投递方式(push的路由规则或pull的寻址及过滤)就已经是很了解了。再加上个高可用主从模式,就几乎完全掌握了。
如何深入理解一套MQ消息中间件的更多相关文章
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...
- IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?
1.前言 在IM这种讲究高并发.高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转.消息削峰.消息交换异步化等等角色,当然MQ消息中间件的作用远不止于 ...
- IBM MQ消息中间件jms消息中RHF2消息头的处理
公司的技术平台在和某券商对接IBM MQ消息中间件时,发送到MQ中的消息多出了消息头信息:RHF2,造成消息的接收处理不正常.在此记录此问题的处理方式. 在IBM MQ中提供了一个参数 targetC ...
- 【绝对有收获】看看?必须告诉你为什么要使用MQ消息中间件(图解版)
欢迎关注文章系列 ,关注我 <提升能力,涨薪可待> <面试知识,工作可待> <实战演练,拒绝996> 也欢迎关注微信公众号[Ccww笔记],原创技术文章第一时间推出 ...
- MQ消息中间件,面试能问些什么?
MQ消息中间件,面试能问些什么? 为什么使用消息队列?消息队列的优点和缺点? kafka.activemq.rabbitmq.rocketmq都有什么优缺点? 面试官角度分析: (1)你知不知道你们系 ...
- 理解JAVA MQ消息中间件
MQ的几种消息传递方式 发布订阅模式 发布订阅模式有点类似于我们日常生活中订阅报纸.每年到年尾的时候,邮局就会发一本报纸集合让我们来选择订阅哪一个.在这个表里头列了所有出版发行的报纸,那么对于我们每一 ...
- MQ消息中间件
MQ是什么? MQ是Message Queue消息队列的缩写.消息队列是一种应用程序对应用程序的通信方法.应用程序通过写和检索入列队的针对应用程序的数据(消息)来进行通信,而不需要专用连接来链接它们. ...
- 为什么要使用MQ消息中间件?
在面试大型互联网公司的时候,很可能会被问到消息队列的问题: 1.在何种场景下使用了消息中间件? 2.为什么要在系统里引入消息中间件? 3.如何实现幂等? 链式调用是我们在写程序时候的一般流程,为了完成 ...
- 为什么要使用MQ消息中间件?这3个点让你彻底明白!
前言 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三个主要的,即以下六个字: 解 ...
随机推荐
- VirtualBox 命令行操作
vboxmanage list vmsvboxmanage list runningvmsvboxmanage startvmvboxmanage controlvm "RHEL6.1_fo ...
- 在VM虚拟机中彻底删除Linux系统
前言:很久之前安装了Linux虚拟系统,然后用户名忘记了,想着重新安装个Ubuntu系统,就想着删除以前的系统. 删除方法如下: 1.点击打开该Linux系统. 2. 点击虚拟机的左上方“虚拟机”-& ...
- 【随笔】node.js + npm的安装
需要用到node.js和npm,所以来安装下. 在网上找了找教程,好多都是分开装的,各种麻烦各种事,最后还是在node.js官网里下载解决了.记录一下. 如果安装在当前环境,直接点击install会自 ...
- Unity Github 项目收集
http://gad.qq.com/article/detail/24048 重磅推荐: Github 热门 Unity Assets 查询:http://unitylist.com/browse 最 ...
- Hibernate 一对一映射(共享主键)
- Python基础(3) - 数据类型:5字典类型
Python Dictionary 是 Python 的内置数据类型之一, 它定义了键和值之间一对一的关系 .它是用{}括起来的.每个Dictionary的项的句法为:key:value. Dicti ...
- Getting over the dangers of rm command in Linux---reference
reference:http://www.coolcoder.in/2014/01/getting-over-dangers-of-rm-command-in.html When we want to ...
- IDE vscode识别webpack中alias配置路径
引言网上看到一篇关于 ctrl+鼠标左键无法识别别名路径的问题,最后有人回复的方法只能在ts项目中可以识别 https://segmentfault.com/q/1010000011911879 最后 ...
- Golang教程:指针
什么是指针 指针是存储一个变量的内存地址的变量. 在上图中,变量 b 的值是 156,存储在地址为 0x1040a124 的内存中.变量 a 存储了变量 b 的地址.现在可以说 a 指向b. 指针的声 ...
- ComboBox ItemHeight 再高一点
public static void BindData(this ComboBox box, List<KeyValuePair<long, string>> data) { ...