消息中间件 RabbitMq ActiveMQ RocketMQ kafka 安装RabbitMQ (33条消息) RabbitMQ安装教程(超详细)_凡尘-追梦者的博客-CSDN博客 为什么要使用消息队列 为什么使用消息队列? 简单模式下交换机会使用默认的 "" 2. routingKey:路由名称 3. props:配置信息 4. body:发送消息数据 */ testTopic02(){ mqSender.send04("发消息喽04"); } 测试2 @Test public void testTopic(){ mqSender.send03 ("发消息喽03"); mqSender.send04("发消息喽04"); } 发现再不同时发送的时候,两个接受队列都可以接收到消息04; 但是为什么在同一个方法中,两个接受队列不能同时接受消息
;设为false时,出现上述情形broker会直接将消息扔掉; immediate: 3.0以前这个标志告诉服务器如果该消息关联的queue上有消费者,则马上将消息投递给它,如 果所有queue都没有消费者 ,直接把消息返还给生产者,不用将消息入队列等待消费者了。 创建消息时通过参数指定 append的方式写文件,会根据大小自动生成新的文件,rabbitmq启动时会创建两个进程,一个负责持久化消息的存储,另一个负责非持久化消息的存储(内存不够时) 消息存储时会在ets 表中记录消息在文件中的映射以及相关信息(包括id、偏移量,有效数据,左边文件,右边文件),消息读取时根据该信息到文件中读取、同时更新信息 消息删除时只从ets删除,变为垃圾数据,当垃圾数据超出比例(默认 消息在队列的存活时间超过设置的TTL时间。 消息队列的消息数量已经超过最大队列长度。 那么该消息将成为死信消息。
消息中间件的应用场景 主流 MQ 框架及对比 说明 Kafka 优点 Kafka 缺点 RocketMQ Pulsar 发展趋势 各公司发展 Kafka Kafka 是什么? [2021-01-24-092401.png] 消息中间件的应用场景 异步解耦 削峰填谷 顺序收发 分布式事务一致性 腾讯应用案例: [2021-01-24-093404.png] 主流 MQ 框架及对比 开源的消息引擎系统(消息队列/消息中间件) 分布式流处理平台 发布/订阅模型 削峰填谷 Kafka 术语 Topic:发布订阅的主题 Producer:向Topic发布消息的客户端 Consumer:消费者 为了保证最终一致,消息系统和业务程序需要保证: 消息发送的一致性:消息发送时,一阶段事务和消息发送必须同时成功或失败 消息存储不丢失:消息发送成功后,到消息被成功消费前,消息服务器(broker)必须存储好消息 1 异常,半消息发送失败,本地 DB 没有执行,整个操作失败,DB/消息的状态一致(都没有提交) 2 异常/超时 生产者以为失败了,不执行 DB broker 存储半消息成功,等不到后序操作,会询问生产者是提交还是回滚
在阅读本篇之前希望读者能够先仔细读下关于RocketMQ分布式消息队列Remoting通信模块的两篇文章: (1)消息中间件—RocketMQ的RPC通信(一) (2)消息中间件—RocketMQ的 (2)Broker(Master):RocketMQ消息代理服务器主节点,起到串联Producer的消息发送和Consumer的消息消费,和将消息的落盘存储的作用; (3)Broker(Slave): : (1)同步方式 (2)异步方式 (3)Oneway方式 其中,使用(1)、(2)种方式来发送消息比较常见,具体使用哪一种方式需要根据业务情况来判断。 (2)sendLatencyFaultEnable开关关闭(默认关闭):采用随机递增取模的方式选择一个队列(MessageQueue)来发送消息。 ()方法); (3)将与该消息相关信息封装成RemotingCommand数据包,其中请求码RequestCode为以下几种之一: a.SEND_MESSAGE(普通发送消息) b.SEND_MESSAGE_V2
要做技术选型,那么必须对现今的各个消息中间件有个深入的理解才能做技术选型。否则别人问你,你为什么要用这个消息中间件,你说不出个所以然来,怎么做架构师呢? Redis 在我们印象中,Redis 是一个 key-value 缓存中间件,而不是一个消息队列中间件。但事实上它本身支持 MQ 功能,所以完全可以当做一个轻量级的队列服务来使用。 而在 RabbitMQ 和 ActiveMQ 这两个消息中间件中,RabbitMQ 的更新频率和社区更加活跃一些,所以可以优先选择 RabbitMQ 作为中间件。 看完之后,你应该能解答下面几个问题: 我的系统要使用哪个消息队列中间件? 下篇,我们聊聊使用消息队列需要考虑的几个问题。 参考资料 [1].【原创】分布式之消息队列复习精讲 [2].Kafka 设计解析(一):Kafka 背景及架构介绍
消息中间件的应用场景 1、跨系统数据传递 2、高并发的流量削峰 3、数据的分发与异步处理 4、大数据分析与处理 5、分布式事务 协议 只有把协议定好了才能进行工作。 2、语义。 3、时序。 为什么消息队列不使用HTTP协议呢? 这样不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程。 AMQP协议 特性: 1、分布式事务支持。 2、消息的持久化支持。。 3、高性能和高可靠的消息处理优势。 不支持数据库存储 消息的分发策略 MQ有几个角色: 1、生产者。 2、存储消息。 3、消费者。 消息分发策略机制和对比 发布订阅:就是只要订阅了,有消息了就能收到信息。 重发: 当订单系统没有反馈,即中间件没有收到订单系统的反馈,那么就会重发消息,保证消息的可靠性期。
// 签收消息 /** * 参数1:消息投递序号 * 参数2:是否一次可以签收多条消息 * 22 * 参数2:是否一次可以拒签多条消息 23 * 参数3:拒签后消息是否重回队列 24 */ 25 channel.basicNack ).to(exchange).with("my_routing").noargs(); } } 2.生产者批量生产消息,测试存活时间 @Test 2 public void testSendBatch2 2 消息过期后,并不会马上移除消息,只有消息消费到队列顶 端时,才会移除该消息。 (Dead message)后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列。
简介 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 2. 常用消息中间件对比 特性 ActiveMQ RabbitMQ RocketMQ Kafka 开发语言 java erlang java scala 单机吞吐量 万级 万级 10万级 10万级 时效性 ms 选择建议 消息中间件 建议 Kafka 追求高吞吐量,适合产生大量数据的互联网服务的数据收集业务 RocketMQ 可靠性要求很高的金融互联网领域,稳定性高,经历了多次阿里双11考验 RabbitMQ ,短信通知必须要有顺序 …… kafka 集群托管 4 个分区(P0-P3),2 个消费者组,消费组 A 有 2 个消费者,消费组 B 有 4 个 topic 分区中消息只能由消费者组中的唯一一个消费者处理
,由Erlang(专门针对于大数据高并发的语言)语言开发,可复用的企业消息系统,是当前最主流的消息中间件之一,具有可靠性、灵活的路由、消息集群简单、队列高可用、多种协议的支持、管理界面、跟踪机制以及插件机制 2.什么是消息和队列 1.消息 就是数据,增删改查的数据。 例如在员工管理系统中增删改查的数据 2.队列 指的是一端进数据一端出数据,例如C#中(Queue数据结构) 3.什么是消息队列 1.消息队列指:一端进消息,一端出消息 2.RabbitMQ就是实现了消息队列概念的一个组件 1.生产端 2.存储端 3.消费端 1.消息生产端 我们在给RabbitMQ发送消息时,如何去保证消息一定到达呢,我们可以使用RabbitMQ提供了2种生产端的消息确认机制 模式 描述 实现方式 Confirm 2.集群 3.消息消费端 1.消费者宕机,导致消息丢失 2.执行业务逻辑失败,但是消息已经被消费 当生产者写入消息到RabbitMQ后,消费服务接收消息期间,服务器宕机,导致消息丢失了,这个时候我们就应该使用
消息格式 服务器和客户端来往的消息只有三种,分别是订阅(SUB),发布(PUB),推送消息(MSG). 其中前两种是从客户端向服务端推送,最后一种则是服务端向客户端推送. #[derive(Debug)] pub const ERROR_PARSE: i32 = 1; pub const ERROR_MESSAGE_SIZE_TOO_LARGE: i32 = 2; pub 返回结果 parse的结果不外乎四种情况 出错了 到目前为止还没有收到完整的消息 比如只收到了SUB SUBJECT ,消息不完整,当然不能处理 一条PUB消息 一条SUB消息 rust #[derive } 消息解析 有了这些定义以后,真正的消息解析过程就会清晰很多. parse 函数的定义 /** 对收到的字节序列进行解析,解析完毕后得到pub或者sub消息, 同时有可能没有消息或者缓冲区里面还有其他消息 ) { let mut p = Parser::new(); let mut buf = "SUB subject 1\r\nSUB subject2 2\r\n".as_bytes
消息中间件RabbitMQ 1.什么是消息中间件 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。 为什么使用MQ? 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量 2.应用场景 2.1 任务异步处理 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理 但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000QPS,直到消费完积压的消息,这就叫做**“填谷”** 3. 3.2 JMS JMS 即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息 JMS 规定了两种消息模式; AMQP的消息模式更加丰富 4.多种消息中间件 常见的消息队列有如下: ActiveMQ:基于 JMS ZeroMQ:基于 C 语言开发 RabbitMQ:基于 AMQP
其实在后台系统中是排了,只不过排队的时间对于人来说有点短,可能1-2秒就结束了,但是对于计算机来说,这1-2秒的时间很长了。 大型分布式系统建设中,消息队列主要解决应用耦合、异步消息、流量削锋等问题。 是大型分布式系统不可缺少的中间件。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。 [2]拥有权限的进程可以向消息队列中写入或读取消息。 image-20200420193350371 2.消息延迟情况 延迟越低越好啦,几百毫秒正常水平。 ? IBM MQ:它是一个消息传递中间件,可以简化和加速跨多个平台的不同应用程序和业务数据的集成。它提供了经过验证的企业级消息传递功能,能够熟练而安全地移动信息。
在阅读本篇之前希望读者能够先仔细阅读下关于RocketMQ分布式消息队列的前几篇文章: (1)消息中间件—RocketMQ的RPC通信(一) (2)消息中间件—RocketMQ的RPC通信(二) (3)消息中间件—RocketMQ消息发送 一、如何选择消息消费的方式—Pull or Push? 1.1 MQ中Pull和Push的两种消费方式 对于任何一款消息中间件而言,消费者客户端一般有两种方式从消息中间件获取消息并消费: (1)Push方式:由消息中间件(MQ消息服务器代理)主动地将消息推送给消费者 概括起来地说就是“慢消费问题”),而MQ不断地向消费者Push消息,消费者端的缓冲区可能会溢出,导致异常; (2)Pull方式:由消费者客户端主动向消息中间件(MQ消息服务器代理)拉取消息;采用Pull 方式,如何设置Pull消息的频率需要重点去考虑,举个例子来说,可能1分钟内连续来了1000条消息,然后2小时内没有新消息产生(概括起来说就是“消息延迟与忙等待”)。
RabbitMQ 消息中间件 1、消息中间件 1、简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。 通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。 当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。 2、作用 1、消息中间件主要作用 解耦 冗余(存储) 扩展性 削峰 可恢复性 顺序保证 缓冲 异步通信 2、消息中间件的两种模式 1、P2P模式 P2P模式包含三个角色:消息队列(Queue)、发送者( ,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 4、什么和是消息队列 MQ 全称为Message Queue, 消息队列。
它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。 Producer: 消息生产者,如图A、B、C,数据的发送方。 消息生产者连接RabbitMQ服务器然后将消息投递到Exchange。 Consumer:消息消费者,如图1、2、3,数据的接收方。 消息消费者订阅队列,RabbitMQ将Queue中的消息发送到消息消费者。 VirtualHost:权限控制的基本单位 一个VirtualHost里面有若干Exchange和MessageQueue,以及指定被哪些user使用 我来一句话总结下我理解消息中间件 类似于厨师做完菜只管把菜送给服务员就可以忙自己的事了 另外这里说一下我用RabbitMQ的原因 1.语言无关,什么语言都可以,对我们这边很多使用不同语言开发的项目比较友好,大家都可以用 2.低时延,并发能力高,他是基于erlang语言开发,erlang内部对多线程做了很多优化
中间件是什么 中间件是计算机软件,它为操作系统以外的软件应用程序提供服务。它可以被描述为“软件粘合剂”。 中间件使软件开发人员更容易实现通信和输入/输出,因此他们可以专注于应用程序的特定用途。 在这种更具体的意义上,中间件可以描述为客户机-服务器中的破折号(“-”) ,或者对等网络中的对等网络。中间件包括 web 服务器、应用服务器、内容管理系统以及支持应用程序开发和交付的类似工具。 数据库访问服务通常被描述为中间件。其中一些是特定于语言的实现,并支持异构特性和其他相关的通信特性。面向数据库中间件的例子包括 ODBC、 JDBC 和事务处理监视器。 消息中间件 MQ 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。
通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 消息队列中间件,也可以称为消息队列或者消息中间件。 它一般有两种传递模式:点对点 (P2P, Point-to-Point)模式和发布订阅(Pub/sub)模式。 图1-1 应用通过消息中间件进行通讯 消息中间件将消息路由给应用程序B,这样消息就可存在于完全不同的计算机上。 消息中间件负责处理网络通信,如果网络连接不可用,消息中间件会存储消息,直到连接变得可用,再将消息转发给应用程序B.灵活性的另一方面体现在,当应用程序A发送其消息时,应用程序B甚至可以处于不运行状态,消息中间件将保留这份消息 消息中间件降低了进程闻的耦合度,所以即使一个处理消息的进程挂掉,加入消息中间件中的消息仍然可以在系统恢复后进行处理。
消息中间件选型 常用的 MQ组件有 Kafka、RabbitMQ、RocketMQ、ActiveMQ、ZeroMQ、MetaMQ。 RocketMQ RocketMQ是阿里开源的消息中间件,它是纯 Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。 在同步发送场景中,三个消息中间件的表现区分明显: Kafka Kafka 的吞吐量高达17.3w/s,是高吞吐量消息中间件的行业老大。这主要取决于它的队列模式保证了写磁盘的过程是线性IO。 【2】以下场景你比较适合使用 RabbitMQ。 你有较少的事件(2万以上/秒)并且需要通过复杂的路由逻辑去找到消费者、你希望消息传递是可靠的、你并不关心消息传递的顺序、你需要现在就支持集群-节点级别的高可用或则说你需要7*24小时的付费支持(当然也可以通过论坛
这里先回顾往期RocketMQ技术分享的篇幅: (1)消息中间件—RocketMQ的RPC通信(一) (2)消息中间件—RocketMQ的RPC通信(二) (3)消息中间件—RocketMQ消息发送 (4)消息中间件—RocketMQ消息消费(一) (5)消息中间件—RocketMQ消息消费(二)(push模式实现) 一、其他MQ中间件消费端可靠性的保障 在业务开发中,大家一定都遇到过业务工程因为各类异常 (可能是业务工程本身的异常、JVM内存异常或者系统所在的虚拟机宕机等),而导致MQ中间件发送过来的业务消息消费失败而无法再次消费该消息的情况。 目前,很多MQ消息中间件都有相应的机制和方法来保证Consumer端消费消息的可靠性。下面先来看看RabbitMQ和Kafka这两款MQ消息中间件是如何来保证消费者端消息处理的可靠性的呢? invite_code=f5z033h1gm2x
举个例子:消息第一次消费失败入重试队列Q1,Q1的重新投递延迟为5s,在5s过后重新投递该消息;如果消息再次消费失败则入重试队列Q2,Q2的重新投递延迟为10s,在10s过后再次投递该消息。 2后加1了,造成了数据不一致。 不支持 事务性消息 支持 支持 2. 性能 功能维度是消息中间件选型中的一个重要的参考维度,但这并不是唯一的维度。 消息中间件的性能一般是指其吞吐量,虽然从功能维度上来说,RabbitMQ的优势要大于Kafka,但是Kafka的吞吐量要比RabbitMQ高出1至2个数量级,一般RabbitMQ的单机QPS在万级别之内 如果不是KPI的压迫可以先考虑下这2个问题:1. 目前市面上的消息中间件是否都真的无法满足目前业务需求? 2. 团队是否有足够的能力、人力、财力、精力来支持自研?