常用的消息中间件RabbitMQ

目录

一、消息中间件

1、简介

2、作用

3、两种模式

1、P2P模式

2、Pub/Sub模式

4、常用中间件介绍与对比

1、Kafka

2、RabbitMQ

3、RocketMQ

RabbitMQ和Kafka的区别

二、RabbiMQ集群

RabbiMQ特点

RabbitMQ模式⼤概分为以下三种:

集群中的基本概念:

集群中的两种节点

三、实例:RabbiMQ集群部署

1、准备环境

2、三个节点配置安装rabbitmq软件

3、创建用户

4、开启用户远程登录:

5、查看端口

6、测试

7、部署集群

8)查看集群状态


一、消息中间件

1、简介

消息中间件也可以称消息队列         

        指用高效可靠的消息传递机制进行与平台无关的数据交流

        基于数据通信来进行分布式系统的集成。

        通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。

        当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。

2、作用

  • 冗余(存储)

  • 扩展性

  • 可恢复性

  • 顺序保证

  • 缓冲

  • 异步通信

3、两种模式

1、P2P模式

        P2P模式包含三个角色:

                消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

P2P的特点:

  • 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中

  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列

  • 接收者在成功接收消息之后需向队列应答成功

  • 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式

2、Pub/Sub模式

        Pub/Sub模式包含三个角色:

                主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

Pub/Sub的特点:

  • 每个消息可以有多个消费者

  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息

  • 为了消费消息,订阅者必须保持运行的状态

  • 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

4、常用中间件介绍与对比

1、Kafka

        Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。

2、RabbitMQ

        RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

3、RocketMQ

        RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

RabbitMQ和Kafka的区别

        RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

二、RabbiMQ集群

RabbiMQ特点

  • 可靠性

  • 扩展性

  • 高可用性

  • 多种协议

  • 多语言客户端

  • 管理界面

  • 插件机制

RabbitMQ模式⼤概分为以下三种:

        (1)单⼀模式。

        (2)普通模式(默认的集群模式)。

        (3) 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA⽅案,在对业务可靠性要求较⾼的场合中⽐较适⽤)。要实现镜像模式,需要先搭建⼀个普通集群模式,在这个模式的基础上再配置镜像模式以实现⾼可⽤。

集群中的基本概念:

        RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。

        一个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的。

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
Channel(信道):消息推送使用的通道;
Exchange(交换器):用于接受、分配消息;
Queue(队列):用于存储生产者的消息;
RoutingKey(路由键):用于把生成者的数据分配到交换器上;
BindingKey(绑定键):用于把交换器的消息绑定到队列上;
Broker:简单来说就是消息队列服务器实体
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
user:用户

集群中的两种节点

        1 内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk)

        2 磁盘节点:保存状态到内存和磁盘。

推荐

        内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了

        如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

三、实例:RabbiMQ集群部署

1、准备环境

注:这⾥三台服务器都联⽹,另外RabbitMQ集群节点必须在同⼀⽹段⾥,如果是跨⼴域⽹,效果会变差。关闭防火墙和selinux

三台机器分别为:

        10.12.153.133   rabbitmq-1

        10.12.153.71     rabbitmq-2

        10.12.153.72     rabbitmq-3

互相在/etc/hosts内做好域名解析

2、三个节点配置安装rabbitmq软件

注:所有机器都操作

 erlang 版本选择

rabbitmq/erlang - Packages · packagecloud

1)安装依赖
# yum install -y epel-release gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel2)安装erlang
# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash这里我们示例erlang-21.3.8.21-1.el7.x86_64版本
# yum install erlang-21.3.8.21-1.el7.x86_64

测试:

# erl

成功回显如下

3)安装rabbitmq

 rabbitmq 版本选择

Tags · rabbitmq/rabbitmq-server · GitHub

这里我们选择rabbitmq-server-3.7.10-1.el7

下载源码包并安装

4)启动

方法一:# systemctl daemon-reload
# systemctl start rabbitmq-server
# systemctl enable rabbitmq-server方式二:
# /sbin/service rabbitmq-server status  ---查看状态
# /sbin/service rabbitmq-server start   ---启动

5)开启rabbitmq的web访问界面:

rabbitmq-plugins enable rabbitmq_management

3、创建用户

注意:在一台机器操作

添加用户和密码

# rabbitmqctl add_user ztn  123456


设置为管理员

# rabbitmqctl set_user_tags ztn administrator


查看用户

# rabbitmqctl list_users

设置权限

此处设置权限时注意'.*'之间需要有空格 三个'.*'分别代表了conf权限,read权限与write权限

例如:当没有给newrain设置这三个权限前是没有权限查询队列,在ui界面也看不见

# rabbitmqctl set_permissions -p "/" ztn ".*" ".*" ".*"

4、开启用户远程登录:

注:所有机器都操作

 cd /etc/rabbitmq/

备份配置文件

 cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
 vim rabbitmq.config
修改如下:

三台机器都操作后重启服务服务:

systemctl restart rabbitmq-server

5、查看端口

!注意如果是云服务器,切记添加安全组端口放行。

6、测试

浏览器访问

注意:

rabbitmq默认管理员用户:guest 密码:guest

我们刚才新添加的用户为:ztn 密码:123456

登录后页面

7、部署集群

注:三台机器都操作

1)首先创建好数据存放目录和日志存放目录

mkdir -p /data/rabbitmq/data
mkdir -p /data/rabbitmq/logs
chmod 777 -R /data/rabbitmq
chown rabbitmq.rabbitmq /data/ -R

创建配置文件:

vim /etc/rabbitmq/rabbitmq-env.conf
加入以下内容
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs

重启服务

systemctl restart rabbitmq-server

2)拷⻉erlang.cookie

        Rabbitmq的集群是依附于erlang的集群来⼯作的,所以必须先构建起erlang的集群景象。Erlang的集群中

        各节点是经由过程⼀个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,⽂件是400的权限。所以必须保证各节点cookie⼀致,不然节点之间就⽆法通信.

 文件位置:

        (官方在介绍集群的文档中提到过.erlang.cookie 一般会存在这两个地址:第一个是home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在{home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。)

cat /var/lib/rabbitmq/.erlang.cookie



⽤scp的⽅式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中

scp /var/lib/rabbitmq/.erlang.cookie root@10.12.153.71:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@10.12.153.72:/var/lib/rabbitmq/

3)将mq-2、mq-3作为内存节点加⼊mq-1节点集群中

在mq-2、mq-3执⾏如下命令:
mq-2:

systemctl restart rabbitmq-serverrabbitmqctl stop_app  #停止节点rabbitmqctl reset   #如果有数据需要重置,没有则不用rabbitmqctl join_cluster --ram root@rabbitmq-1  #添加到磁盘节点Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...rabbitmqctl start_app  #启动节点Starting node 'rabbit@rabbitmq-2' ...


======================================================================
mq-3:

systemctl restart rabbitmq-serverrabbitmqctl stop_app
Stopping node 'rabbit@rabbitmq-3' ...rabbitmqctl reset
Resetting node 'rabbit@rabbitmq-3' ...rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-1' ...
rabbitmqctl start_app
Starting node 'rabbit@rabbitmq-3' ...

(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_type
disc(ram),前提是必须停掉rabbit应⽤
注:
#如果有需要使用磁盘节点加入集群

rabbitmqctl join_cluster  rabbit@rabbitmq-1rabbitmqctl join_cluster  rabbit@rabbitmq-1

8)查看集群状态

在 RabbitMQ 集群任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。
在mq-1磁盘节点上面查看
rabbitmqctl cluster_status

1564158874154

每台机器显示出三台节点,表示已经添加成功!
(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉
rabbit应用
在RabbitMQ集群集群中,必须⾄少有⼀个磁盘节点,否则队列元数据⽆法写⼊到集群中,当磁盘节点宕掉时,集群将⽆法写⼊新的队列元数据信息。

希望能够帮助到大家!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统安全:安全技术和防火墙

目录 一、安全技术和防火墙 1.安全技术 2.防火墙的分类 二、防火墙 1.iptables四表五链 2.黑白名单 3.iptables基本语法 4.iptables选项 5.控制类型 6.隐藏扩展模块 7.显示扩展模块 8.iptables规则保存 9.自定义链使用 一、安全技术和防火墙 1.安全技术 入侵检测系…

2000-2022各省产业结构高级化合理化指数(含原始数据、计算过程+计算结果)

2000-2022各省产业结构高级化合理化指数(含原始数据、计算过程计算结果) 1、时间:2000-2022年 2、指标:国内生产总值、第一产业增加值、第二产业增加值、第三产业增加值、总就业人数、第一产业就业人数、第二产业就业人数、第三…

C++中自定义类型使用标准输入cin输出cout

自定义类型的输出 引言示例一运行结果示例二运行结果注意点 引言 当自己定义的数据为一些复杂数据&#xff0c;不再为基本数据类型&#xff0c;这时候要使用cout输出这些数据&#xff0c;就需要重载输出运算符<<,这样就可以使用cout来输出自定义的数据&#xff0c;相同如…

【高阶数据结构】B+树

文章目录 1. B树的概念2. B树的查找3. B-树 VS B树4. B 树的插入分析 1. B树的概念 B树是B树的变形&#xff0c;是在B树基础上优化的多路平衡搜索树&#xff0c;B树的规则跟B树基本类似&#xff0c;但是又在B树的基础上做了一些改进优化。 一棵m阶的B树需满足下列条件&#x…

算法刷题:找到字符串中所有的字母异位词

找到字符串中所有的字母异位词 .题目链接题目详情题目解析算法原理滑动窗口流程图定义指针及变量进窗口判断出窗口更新结果 我的答案 . 题目链接 找到字符串中所有的字母异位词 题目详情 题目解析 所谓的异位词,就是一个单词中的字母,打乱顺序,重新排列得到的单词 如:abc-&g…

图片怎么变成透明背景?分享这些变透明的方法

很多从事编辑和图片设计的同行在日常工作中经常需要处理图片的背景色。为了更好地进行设计和编辑&#xff0c;将图片的背景色替换成透明是非常必要的。然而&#xff0c;对于一些新手来说&#xff0c;使用专业的图像处理软件可能有些困难。不过&#xff0c;现在有很多在线的图像…

N5182A MXG 矢量信号发生器,100 kHz 至 6 GHz

N5182A MXG 矢量信号发生器 简述&#xff1a; Agilent N5182A 具有快速频率、幅度和波形切换、带有电子衰减器的高功率和高可靠性——所有这些都在两个机架单元 (2RU) 中。安捷伦 MXG 矢量针对制造蜂窝通信和无线连接组件进行了优化。安捷伦 MXG 矢量通过增加吞吐量、提高测试良…

Elasticsearch:什么是 kNN?

kNN - K-nearest neighbor 定义 kNN&#xff08;即 k 最近邻算法&#xff09;是一种机器学习算法&#xff0c;它使用邻近度将一个数据点与其训练并记忆的一组数据进行比较以进行预测。 这种基于实例的学习为 kNN 提供了 “惰性学习&#xff08;lazy learning&#xff09;” 名…

IO进程:多进程实现文件的拷贝

1.使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 程序代码&#xff1a; 1 #include<myhead.h>2 int main(int argc, const char *argv[])3 {4 //判断传入的文件个数5 if(argc!3)6 …

Arcmap excel转shp

使用excel表格转shp的时候&#xff0c;如果你的excel里面有很多字段&#xff0c;直接转很大概率会出现转换结果错误的情况&#xff0c;那么就需要精简一下字段的个数。将原来的表格文件另存一份&#xff0c;在另存为的文件中只保留关键的经度、纬度、和用于匹配的字段即可&…

LeetCode JS专栏刷题笔记(一)

一、前言 LeetCode 在前不久出了一个 JavaScript 专栏&#xff0c;这个专栏一个目的是为了非前端工程师学习 JS&#xff0c;另一个是为了前端工程师提升 JS 能力。 因此在这个专栏中&#xff0c;基本不涉及什么具体算法问题&#xff0c;都是一些 JS 的入门语法与常见的 JS 面…

redis分布式锁redisson

文章目录 1. 分布式锁1.1 基本原理和实现方式对比synchronized锁在集群模式下的问题多jvm使用同一个锁监视器分布式锁概念分布式锁须满足的条件分布式锁的实现 1.2 基于Redis的分布式锁获取锁&释放锁操作示例 基于Redis实现分布式锁初级版本ILock接口SimpleRedisLock使用示…

前端秘法基础式终章----欢迎来到JS的世界

目录 一.JavaScript的背景 二.JavaScript的书写形式 1.行内式 2.嵌入式 3.外部式 三.JS中的变量 1.变量的定义 2.JS动态类型变量 2.1强类型和弱类型 3.JS中的变量类型 四.运算符 五.if语句和三元表达式和Switch语句和循环语句 六.数组 1.创建获取数组元素 2.新增…

unity学习(28)——登录功能

有之前注册的知识&#xff0c;登录就很容易处理了。 登陆成功返回id&#xff1a; 登录失败返回null&#xff1a; 测试同一账号不能重复登陆&#xff01;登录成功后最好可以跳到新的场景中 结果是好的&#xff0c;去服务器看一下对应部分的代码&#xff0c;可见&#xff0c;登…

MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案

项目场景 有时候&#xff0c;遇到数据库重复数据&#xff0c;需要将数据进行分组&#xff0c;并取出其中一条来展示&#xff0c;这时就需要用到group by语句。 但是&#xff0c;如果mysql是高版本&#xff0c;当执行group by时&#xff0c;select的字段不属于group by的字段的…

【FastAPI】P3 请求与响应

目录 请求路径参数查询参数 响应JSON 响应文本响应返回 Pydantic 模型 在网络通讯中&#xff0c;请求&#xff08;Request&#xff09; 与 响应&#xff08;Response&#xff09; 扮演着至关重要的角色&#xff0c;它们构成了客户端与服务器间互动的根本理念。 请求&#xff0…

Linux编辑器——Vim详解

目录 ⭐前言 ⭐vim的基本概念 ⭐vim的基本操作 ⭐vim命令模式命令集 ⭐vim末行模式命令集 ⭐简单vim配置 ⭐配置文件的位置 ⭐常用配置选项 ⭐前言 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容…

CMake的简单使用

一、一个最简单的CMake项目 在Ubuntu上使用CMake构建一个最简单的项目。 1. 安装CMake 首先安装CMake&#xff0c;这里使用的是Ubuntu系统。 sudo apt-get install cmake2. 编写源程序 编写代码&#xff0c;新建文件main.c。 // main.c #include "stdio.h"int …

安卓adb调试备忘录

由于 MAC 的 USB 口全被占用着&#xff0c;采用无线连接刚方便&#xff0c;记录一下&#xff0c;以防忘记~ ADB原理 adb devices -l ## 列出连接的设备adb tcpip [端口号] adb tcpip 6666 # 将当前已连接USB上的Mobile端切换为TCP/IP模式&#xff0c;以6666端口进行监听. adb…

你真的了解—————NumPy吗

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;opencv &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的…