Rabbit MQ 介绍

Rabbit MQ 介绍
  • RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,起初源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗.RabbitMQ主要是为了实现系统之间的双向解耦而实现的.当生产者大量生产数据时,消费者无法快速消费,就需要一个中间层,保存这个数据.
  • AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.AMQP的主要特征是面向消息、队列、路由(包括点对点&发布/订阅)、可靠性、安全.
  • RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:PythonRuby.NETJavaJMSCPHPActionScriptXMPPSTOMP等,支持AJAX.用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗.

相关概念

通常我们谈到队列服务,会有一个流程概念:提供者->队列->消费者,RabbitMQ在这个基本概念上,多做了一层抽象,在发消息者和队列之间,加入了交换器(Exchange).这样发消息者和队列就没有没有直接联系,转而变成消息提供者把消息交给交换器,交换器根据调度策略再把消息交给队列.

虚拟主机:

  • 一个虚拟主机持有一组交换机、队列和绑定.为什么需要多个虚拟主机呢?很简单,RabbitMQ当中,用户只能在虚拟主机粒度进行权限控制.因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机.每一个RabbitMQ服务器都会有一个默认的虚拟主机"/".

交换机:

  • Exchange用于转发消息,但是它不会做存储,如果没有Queue bind到Exchange的话,他会直接丢弃掉Producer发送过来的消息.这里有一个比较重要的概念:路由键.消息到交换机的时候,交换机会转发到对应的队列中,那么究竟转发到哪个队列,就要根据该路由键.

绑定:

  • 也就是交换机需要和队列相绑定,这其中是多对多关系.
    交换机:
    交换机的功能主要是接受消息并且转发到绑定的队列,交换机不存储消息,在启用ack模式后,交换机找不到队列会返回错误.交换机有四种类型:Driect,Topic,Headers,Fanout
    Direct: "先匹配,再投送",即在绑定时设定一个routing_key,消息的routing_key匹配时,才会被交换器投送到绑定的队列去.
    Topic: 按规则转发消息(最灵活)
    Headers: 设置header attribute参数类型的交换机
    Fanout: 转发消息到所有绑定队列.

Direct Exchange

Direct Exchange 是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列.

第一个X-Q1就有一个binding key,名字为orange;X-Q2有两个binding key,名字为blackgreen.当消息中的路由键和这个binding key对应上的时候,就知道该消息去到哪个队列中.

Topic Exchange

Topic Exchange转发消息主要是根据通配符.在这种交换器下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换器才能转发消息.
在这种交换机模式下:
路由键必须是一串字符,用句号(.)隔开,比如说agreements.us,或者agreements.us.stockholm等.
路由模式必须包含一个星号()或者井号(#),()主要用于匹配路由键指定位置的一个单词,(#)主要用于匹配指定位置的0个或多个单词.
消息发送代码示例如下:

rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2","this is Rabbit")

Param1表示交换器,Param2表示路由键,Param3表示消息.

Headers Exchange

headers也是根据规则匹配,相较于directtopic固定地使用routing_key,headers是一个使用自定义匹配规则的类型,在队列与交换器绑定时,会设定一组键值对规则,消息中也包括一组键值对(headers)属性,当这些键值对有一对,或全部配对时,消息被投送到对应队列.

Fanout Exchange

Fanout Exchange消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定它的全部队列,如果配置了routingkey会被忽略.

Read more

RocketMQ消息的文件组织形式

RocketMQ消息的文件组织形式

RocketMQ文件的组织形式主要围绕消息的高效存储与检索设计,主要包括CommitLog、ConsumeQueue和IndexFile三类文件。以下是对这三类文件组织形式的详细阐述: 1. CommitLog文件 * 作用:CommitLog是消息存储的主体文件,用于存储Producer端写入的消息主体内容。 * 组织形式: * 所有topic的消息都存储在同一个CommitLog文件中,确保消息发送时按顺序写文件,以追求极致的消息存储性能和高吞吐量。 * 单个文件大小默认1G,文件名长度为20位,左边补零,剩余为起始偏移量。例如,第一个文件名为00000000000000000000,代表起始偏移量为0,文件大小为1G。当第一个文件写满后,第二个文件名为00000000001073741824,以此类推。 * 存储内容:消息内容不是定长的,每条消息在CommitLog中的存储结构包括消息长度、消息体、消息属性等。 2. ConsumeQueue文件 * 作用:ConsumeQueue是消息消费队列文件,主要用于提高消息消费的性

By Zhewen Cao
记一次消息推送业务的探索

记一次消息推送业务的探索

什么是服务端消息推送 服务端消息推送(Push Notification)是一种技术概念,指的是从服务端实时发送信息到客户端的过程。在移动互联网和Web应用中,服务端消息推送被广泛用于提升用户体验、增加用户粘性和活跃度。以下是服务端消息推送的详细解释: 定义 服务端消息推送,简称推送(Push),是指服务器主动向客户端发送信息,而无需客户端显式请求。这种方式使得信息能够实时地到达用户,无需用户手动刷新页面或应用。 实现方式 服务端消息推送的实现方式多种多样,主要包括以下几种: 1. 短轮询(Short Polling): * 客户端定时向服务器发送请求,询问是否有新消息。 * 优点:实现简单。 * 缺点:实时性差,服务器资源消耗大。 2. 长轮询(Long Polling): * 客户端向服务器发送请求后,服务器会保持连接,直到有新消息才返回响应并关闭连接。 * 优点:相比短轮询,实时性更好,资源消耗更少。

By Zhewen Cao
Redis Stream:构建高效、可靠的消息队列新选择

Redis Stream:构建高效、可靠的消息队列新选择

引言 随着分布式系统的日益复杂,消息队列作为一种重要的中间件,在解决系统间异步通信、负载均衡、数据缓冲等方面发挥着不可替代的作用。Redis,作为一个高性能的键值存储系统,在5.0版本中引入了Stream这一新的数据结构,为构建高效、可靠的消息队列提供了新的选择。本文将深入探讨Redis Stream的架构、特性及其在消息队列中的应用。 Redis Stream概述 Redis Stream是Redis 5.0版本引入的一种新的数据结构,它提供了一种持久化的、可查询的、可扩展的消息队列服务。Stream类型的数据结构类似于一个日志系统,数据被添加到Stream的末尾,并且每个数据都会被分配一个唯一的序列号(Entry ID),这个序列号是按照时间顺序递增的。这使得Stream类型非常适合用于实现消息队列、事件驱动的系统、数据流处理等场景。 Stream的底层结构 Redis Stream的底层结构主要由基数树(Radix Tree)和Listpack组成。基数树用于索引Listpack,而Listpack用于存储Stream Entry。每个Stream Ent

By Zhewen Cao
MQTT协议帧结构解析

MQTT协议帧结构解析

MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级消息传输协议,广泛应用于物联网(IoT)、移动应用等领域。MQTT的报文帧结构是其通信的基础,主要由三部分组成:固定报头(Fixed Header)、可变报头(Variable Header)和有效载荷(Payload)。以下是对这三部分的详细解析: 1. 固定报头(Fixed Header) 固定报头是MQTT报文帧的开始部分,每个MQTT报文都必须包含固定报头。它占据报文帧的前两个字节,具体结构如下: * 报文类型(4位):第一个字节的前4位(7-4位)用于标识报文类型,MQTT协议定义了16种报文类型,但并非所有类型都已被使用或定义。常见的报文类型包括CONNECT(连接服务器)、CONNACK(连接确认)、PUBLISH(发布消息)、PUBACK(发布确认)、SUBSCRIBE(订阅主题)、SUBACK(订阅确认)等。 * 标志位(

By Zhewen Cao