0


猿创征文|【云原生 | 27】Docker部署运行开源消息队列实现RabbitMQ

作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道第一名🏅 阿里云ACE认证高级工程师🏅
✒️个人主页:小鹏linux
💊个人社区:小鹏linux(个人社区)欢迎您的加入!

为大家推荐一款刷题神奇 点击链接访问牛客网

各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析

分布式系统和大数据处理平台是目前业界关注的热门技术。

本篇文章将重点介绍热门的消息队列中间件RabbitMQ。

1. 关于MQ

1.1 什么是MQ?

消息总线(Message Queue),是一种跨进程、异步的通信机制,用于上下游传递消息。由消息系统来确保消息的可靠传递。

1.2 MQ是干什么用的?

应用解耦、异步、流量削锋、数据分发、错峰流控、日志收集等等...

1.3 MQ衡量标准

服务性能、数据存储、集群架构

1.4 主流竞品分析

当前市面上mq的产品很多,比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。

2. 关于RabbitMQ

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在不同的应用之间共享数据(跨平台跨语言)。RabbitMQ是使用Erlang语言编写,并且基于AMQP协议实现。

2.1 RabbitMQ的优势

  • **可靠性(Reliablity):**使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
  • **灵活的路由(Flexible Routing):**在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
  • **消息集群(Clustering):**多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • **高可用(Highly Avaliable Queues):**队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  • **多种协议(Multi-protocol):**支持多种消息队列协议,如STOMP、MQTT等。
  • **多种语言客户端(Many Clients):**几乎支持所有常用语言,比如Java、.NET、Ruby等。
  • **管理界面(Management UI):**提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
  • **跟踪机制(Tracing):**如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
  • **插件机制(Plugin System):**提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。

2.2 RabbitMQ架构

2.3 RabbitMQ各组件功能

  • **Broker:**标识消息队列服务器实体.
  • **Virtual Host:**虚拟主机。标识一批交换机、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在链接时指定,RabbitMQ默认的vhost是 /。
  • **Exchange:**交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
  • **Queue:**消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
  • **Banding:**绑定,用于消息队列和交换机之间的关联。一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
  • **Channel:**信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟链接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。
  • **Connection:**网络连接,比如一个TCP连接。
  • **Publisher:**消息的生产者,也是一个向交换器发布消息的客户端应用程序。
  • **Consumer:**消息的消费者,表示一个从一个消息队列中取得消息的客户端应用程序。
  • **Message:**消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息头则是由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(优先级)、delivery-mode(消息可能需要持久性存储[消息的路由模式])等。

3. 在Docker中运行RabbitMQ

AMQP架构中有两个主要组件:Exchange和Queue,两者都在服务端,又称Broker,由RabbitMQ实现的。客户端通常有Producer和Consumer两种类型,如下图所示。

在使用RabbitMQ过程中需要注意的是,它将数据存储在Node中,默认情况为hostname。因此在使用docker run指令运行容器的时候,应该通过-h/--hostname参数指定每一个rabbitmq daemon运行的主机名。这样就可以轻松地管理和维护数据了:

$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3 
3f28f6290e05375363ee661151170d37fbc89ada004c3235f02997b711b4cb2b

用户使用rabbitmqctl工具进行远程管理,或跨容器管理的时候,会需要设置持久化的cookie。如果需要了解关于Erlang Cookie的信息,可以参见RabbitMQ官网的集群指南。

这里可以使用RABBITMQ_ERLANG_COOKIE参数进行设置:

$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_ERLANG_ COOKIE='secret cookie here' rabbitmq:3

使用cookie连接至一个独立的实例:

$ docker run -it --rm --link some-rabbit:my-rabbit -e RABBITMQ_ERLANG_COOKIE= 'secret cookie here' rabbitmq:3 bash 
root@f2a2d3d27c75:/# rabbitmqctl -n rabbit@my-rabbit list_users Listing users ... 
guest [administrator]

同样,也可以使用RABBITMQ_NODENAME简化指令:

$ docker run -it --rm --link some-rabbit:my-rabbit -e RABBITMQ_ERLANG_COOKIE= 'secret cookie here' -e RABBITMQ_NODENAME=rabbit@my-rabbit rabbitmq:3 bash 
root@f2a2d3d27c75:/# rabbitmqctl list_users Listing users ... 
guest [administrator]

默认情况下,rabbitmq会安装并启动一些管控插件,如rabbitmq:3- management。通常可以通过默认用户名密码以及标准管控端口15672访问这些插件:

$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3-management

用户可以通过浏览器访问http://container-ip:15672,如果需要从宿主机外访问,则使用8080端口:

$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq: 3-management

如果需要修改默认用户名与密码(guest:guest),则可以使用RABBITMQ_DEFAULT_USER和RABBITMQ_DEFAULT_PASS环境变量:

$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_ USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management

如果需要修改默认vhost,可以修改RABBITMQ_DEFAULT_VHOST环境变量:

$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_ VHOST=my_vhost rabbitmq:3-management

然后连接至daemon:

$ docker run --name some-app --link some-rabbit:rabbit -d application-that-uses- rabbitmq

用户也可以访问官方镜像仓库,并对Dockerfile进行更多定制。

👑👑👑结束语👑👑👑

为大家推荐一款刷题神奇 点击链接访问牛客网

各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析


本文转载自: https://blog.csdn.net/qq_62294245/article/details/126718985
版权归原作者 小鹏linux 所有, 如有侵权,请联系我们删除。

“猿创征文|【云原生 | 27】Docker部署运行开源消息队列实现RabbitMQ”的评论:

还没有评论