title: db-mq-introduce tags:
- work
- mq categories:
- db date: 2019-04-19 11:43:37
一、简述
- 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。
二、topic和queue
- topic用于Pub/Sub发布订阅(广播),任意一个监听队列的消费者都会收到队列中的每一条消息,生产者只塞一条消息。是一对多的对应关系
- queue用于点对点的方式,一个queue可以有多个监听者,但是每个消息只会被消费一次。是一对一的对应关系。
三、优势
- 系统解耦,系统与系统之间没有直接的调用关系。
- 调用是异步,可以提高响应时间,为数据处理提高性能支持。
四、应用场景
- 异步
- 解耦
- 冗余:有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕
- 扩展性:分布式扩容,提高吞吐量
- 过载保护:当数据量剧增的时候,应用程序来不及处理,可以暂时缓存在mq中,等应用程序慢慢处理。
- 可恢复性:消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
- 顺序保证:在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。
- 缓冲:在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度。以调节系统响应时间。
- 数据流处理:分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列完成此类数据收集是最好的选择。
五、常用协议
- AMQP协议:
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。 - MQTT协议:
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。 - STOMP协议:
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。命令模式(非topic\queue模式) - XMPP协议:
(可扩展消息处理现场协议,Extensible Messaging and Presence Protoco)核心是基于XML流传输 - 自定义:
有些特殊框架(如:redis、kafka、zeroMq等)根据自身需要未严格遵循MQ规范,而是基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能。
六、五种中间件的对比
rocketMq | rabbitMq | activeMq | zeroMq | kafka | |
---|---|---|---|---|---|
支持语言 | 只有java | 语言无关 | 语言无关 | 语言无关 | 语言无关 |
消息丢失 | 理论no | 低 | 低 | 会 | 理论no |
延时 | 毫秒 | 微妙 | 微妙 | 极低,号称最快 | 微妙 |
持久化 | 磁盘文件 | 内存,文件 | 内存,文件,db | no | 文件 |
负载均衡 | yes | yes | yes | yes | 依赖zookeeper |
使用场景 | 企业级,大数据量 | 企业级 | 小型系统,数据量不大 | 多用于金融,支持复杂队列 | 实时处理,日志收集 |