消息队列及常见消息中间件
可以直接去看原文:浅谈消息队列及常见的消息中间件
简介
消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段。它具有 低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。
当前使用较多的 消息队列 有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分 数据库 如 Redis、MySQL 以及 phxsql 也可实现消息队列的功能。
消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成。
通过提供 消息传递 和 消息排队 模型,它可以在 分布式环境 下提供 应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步 等等功能,其作为 分布式系统架构 中的一个重要组件,有着举足轻重的地位。
消息队列的特点
采用异步处理模式
消息发送者 可以发送一个消息而无须等待响应。消息发送者 将消息发送到一条 虚拟的通道(主题 或 队列)上,消息接收者 则 订阅 或是 监听 该通道。一条信息可能最终转发给 一个或多个 消息接收者,这些接收者都无需对 消息发送者 做出 同步回应。整个过程都是 异步的。
应用系统之间解耦合
主要体现在如下两点:
- 发送者和接受者不必了解对方、只需要 确认消息;
- 发送者和接受者 不必同时在线。
比如在线交易系统为了保证数据的 最终一致,在 支付系统 处理完成后会把 支付结果 放到 消息中间件 里,通知 订单系统 修改 订单支付状态。两个系统是通过消息中间件解耦的。
传输模式
点对点模型
点对点模型 用于 消息生产者 和 消息消费者 之间 点到点 的通信。消息生产者将消息发送到由某个名字标识的特定消费者。这个名字实际上对于消费服务中的一个 队列(Queue),在消息传递给消费者之前它被 存储 在这个队列中。
特点:
- 每个消息只用一个消费者;
- 发送者和接受者没有时间依赖;
- 接受者确认消息接受和处理成功。
发布/订阅模型(Pub/Sub)
发布者/订阅者 模型支持向一个特定的 消息主题 生产消息。0 或 多个订阅者 可能对接收来自 特定消息主题 的消息感兴趣。
在这种模型下,发布者和订阅者彼此不知道对方,就好比是匿名公告板。这种模式被概况为:多个消费者可以获得消息,在 发布者 和 订阅者 之间存在 时间依赖性。发布者需要建立一个 订阅(subscription),以便能够消费者订阅。订阅者 必须保持 持续的活动状态 并 接收消息。
特性:
- 每个消息可以有多个订阅者;
- 客户端只有订阅后才能接收到消息;
- 持久订阅和非持久订阅。
使用场景
最常用的几种,是做 应用程序松耦合、异步处理模式、发布与订阅、最终一致性、错峰流控
和 日志缓冲 等。反之,如果需要 强一致性,关注业务逻辑的处理结果,则使用 RPC 显得更为合适。
推拉模型
Push推消息模型
消息生产者 将消息发送给 消息队列,消息队列 又将消息推给 消息消费者。
Pull拉消息模型
消费者 请求 消息队列 接受消息,消息生产者 从 消息队列 中拉该消息。
常用消息队列
常用的消息队列(ActiveMQ / RabbitMQ / RocketMQ / Kafka)
RocketMQ
优点
- 单机 支持 1 万以上 持久化队列;
- RocketMQ 的所有消息都是 持久化的,先写入系统 PAGECACHE,然后 刷盘,可以保证 内存 与 磁盘 都有一份数据,而 访问 时,直接 从内存读取。
- 模型简单,接口易用(JMS 的接口很多场合并不太实用);
- 性能非常好,可以允许 大量堆积消息 在 Broker 中;
- 支持 多种消费模式,包括 集群消费、广播消费等;
- 各个环节 分布式扩展设计,支持 主从 和 高可用;
- 开发度较活跃,版本更新很快。
缺点
- 支持的 客户端语言 不多,目前是 Java 及 C++,其中 C++ 还不成熟;
- RocketMQ 社区关注度及成熟度也不及前两者;
- 没有 Web 管理界面,提供了一个 CLI (命令行界面) 管理工具带来 查询、管理 和 诊断各种问题;
- 没有在 MQ 核心里实现 JMS 等接口;
kafka
Apache Kafka 是一个 分布式消息发布订阅 系统。它最初由 LinkedIn 公司基于独特的设计实现为一个 分布式的日志提交系统 (a distributed commit log),之后成为 Apache 项目的一部分。Kafka 性能高效、可扩展良好 并且 可持久化。它的 分区特性,可复制 和 可容错 都是其不错的特性。
主要特性
- 快速持久化:可以在 O(1) 的系统开销下进行 消息持久化;
- 高吞吐:在一台普通的服务器上既可以达到 10W/s 的 吞吐速率;
- 完全的分布式系统:Broker、Producer 和 Consumer 都原生自动支持 分布式,自动实现 负载均衡;
- 支持 同步 和 异步 复制两种 高可用机制;
- 支持 数据批量发送 和 拉取;
- 零拷贝技术(zero-copy):减少 IO 操作步骤,提高 系统吞吐量;
- 数据迁移、扩容 对用户透明;
- 无需停机 即可扩展机器;
- 其他特性:丰富的 消息拉取模型、高效 订阅者水平扩展、实时的 消息订阅、亿级的 消息堆积能力、定期删除机制;
优点
- 客户端语言丰富:支持 Java、.Net、PHP、Ruby、Python、Go 等多种语言;
- 高性能:单机写入 TPS 约在 100 万条/秒,消息大小 10 个字节;
- 提供 完全分布式架构,并有 replica 机制,拥有较高的 可用性 和 可靠性,理论上支持 消息无限堆积;
- 支持批量操作;
- 消费者 采用 Pull 方式获取消息。消息有序,通过控制 能够保证所有消息被消费且仅被消费 一次;
- 有优秀的第三方 Kafka Web 管理界面 Kafka-Manager;
- 在 日志领域 比较成熟,被多家公司和多个开源项目使用。
缺点
- Kafka 单机超过 64 个 队列/分区 时,Load 时会发生明显的飙高现象。队列 越多,负载 越高,发送消息 响应时间变长;
- 使用 短轮询方式,实时性 取决于 轮询间隔时间;
- 消费失败 不支持重试;
- 支持 消息顺序,但是 一台代理宕机 后,就会产生 消息乱序;
几种消息队列对比
参考资料
浅谈消息队列及常见的消息中间件
消息队列及常见消息中间件相关推荐
- 浅谈消息队列及常见的分布式消息队列中间件
背景 分布式消息队列中间件是是大型分布式系统不可缺少的中间件,通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息.所以消息队列主要解决应用耦合.异步消 ...
- 消息队列及常见消息队列介绍
转载 消息队列及常见消息队列介绍 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要 ...
- MQ消息队列的常见用法
消息队列MQ是分布式中重要的组件 目前常见的消息队列有三种:ActiveMQ,RabbitMQ,Kafka 今天我想来梳理一下MQ消息队列的具体常见用法: 1.异步处理 用户注册之后,需要发短信和加积 ...
- weblogic jms消息 删除_消息队列与消息中间件概述:消息中间件核心概念与技术选型...
什么是消息? "消息"是在两台计算机间传送的数据单位. 消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象. 什么是队列? 队列(Queue)队列是一种先进先出 ...
- ①RabbitMQ 消息中间件/消息队列、单节点、集群、镜像集群
文章目录 RabbitMQ 消息中间件/消息队列 1.消息中间件 1.简介 2.作用 消息中间件的两种模式 P2P模式 Rabbitmq Pub/Sub模式(发布/订阅:Topic,可以重复消费) K ...
- rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...
概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...
- 「消息队列」看过来!
一.什么是消息队列? 当我试图用一则通俗的比喻来说明这个概念的时候,我想到一个有意思的比喻:如果把队列抽象成一个集合体,那么消息队列也就是一堆消息的集合.按照这个思路我想到了「杂志」.这不就是一堆消息 ...
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...
- java异步处理_Java编程开发好入门吗 消息队列的用途有哪些
Java编程开发好入门吗?消息队列的用途有哪些?消息队列是指能够提供消息排队消费功能的软件程序,是消息队列中间件的一部分.消息队列中间件是分布式系统中重要的组件.接下来就给大家讲解消息队列的优势.类型 ...
最新文章
- nodejs 获取post数据
- ios开发 json数据文件的存取
- linux配置ip地址 suse_SUSE Linux下设置IP的两种方法
- CSS设计指南(第3版)
- android ui设计当前不同版本的变化,Android 4.0设计规范 十大界面改变
- XML非法字符的处理
- [py]__name__ 属于哪个文件
- matlab可以输出图像吗,MATLAB中使用程序输出图片
- html内编写vbs,HTML_VBS编程教程 (第2篇),第二篇: 我真没想到, - phpStudy
- 远程计算机桌面图标不见了怎么办,网络连接图标不见了原因有哪些【解决方法】...
- 批量修改pdf文件名称(一)
- 传真SIP会话发起协议(SIP)
- linux中双方同步unison服务器搭建
- html如何取消页眉页脚设置,jquery web打印 取消 页眉和页脚
- 金融工程中的蒙特卡罗方法
- 2. 表的操作:创建表、修改表、列约束和表约束、数据操作、删除表
- include指令包含网站banner和版权信息栏
- 克鲁斯卡尔算法(Kruskal)求最小生成树(MST)过程详解
- Java语言规格说明
- CreateEvent