- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
消息队列是指利用队列这种数据结构进行消息发送、缓存、接收,使得进程间能相互通信,是点对点的通信 。
而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不清楚消息的接收者,消息可以被多个消费者接收.
使用消息队列的作用如下 。
异步: 对于一些用户的请求,可能包含一些发送短信,发送邮件等系统处理,此时可以不需要等待短息发送完成或者邮件发送完成,而是通过消息队列通知这些模块即可返回,避免用户长时间等待 。
解耦: 将数据发送到消息队列,对该数据感兴趣的系统自行订阅该消息即可,这种做法可以降低代码的耦合度.
消峰填谷: 将瞬时高并发请求打到消息队队列上,作为数据库请求的缓冲,避免短时间大量的数据库请求导致数据库奔溃.
。
RabbitMQ是一种开源的多协议消息代理软件,它将消息发布者(发布消息的应用程序,也称为生产者)接收消息并将它们路由到消费者(处理消息的应用程序).
RabbitMQ支持多种消息传递协议,其中AMQP 0-9-1是核心,并以插件的形式支持STOM,MQTT,AMQP 1.0.
AMQP,即Advanced Message Queuing Protocol,中文名称是高级消息传递协议.
AMQP 0-9-1 模型如下图所示 。
消息生产者producer和消费者consumer均通过TCP连接消息代理broker,生产者producer将消息投递到交换机exchange,消息代理根据消息队列queue和交换机exchange的绑定关系bind将消息推送到对应的消息队列queue,最后消费者consumer消费感兴趣消息队列中的数据.
。
Producer : 消息生产者 。
Consumer : 消息消费者 。
Broker : 消息代理,这里指即RabbitMQ,通过消息代理可以将消息从生产者投递到消费者 。
Virtual host : 虚拟主机,使单个消息代理能提供了多个相对隔离的环境,隔离的资源包括交换机、队列等 。
Exchange : 交换机,作用相当于现实生活的快递公司,生产者的消息实际时先投递到交换机,交换机再根据类型和绑定关系拷贝消息副本到指定队列,交换机的类型有 direct , topic , headers and fanout 。
Queue : 队列,先进先出的优先级队列,充当了一个缓冲区的角色,作用相当于现实生活中的菜鸟驿站等代收点 。
Binding : 交换机和队列的绑定关系,交换机投递消息到指定队列的规则,作用相当于现实生活中寄快递时填写的地址 。
Connection : 消息生产者和消费者通过TCP连接到虚拟主机,确保数据传输到可靠性 。
Channel : 共享单个TCP连接的轻量级的Connection,不同Channel通过Channel ID隔离开,互不影响,通常一个进程可以只建立一个TCP连接,减少TCP的资源开销 。
。
可靠性(Reliablity): 使用TCP连接进行数据传输、且提供了消息持久化、队列持久化、生产者发送确认、消费者消费确认等机制保证消息的可靠 。
灵活的路由(Flexible Routing): 提供了多种类型的交换机Exchange 。
消息集群(Clustering): 多个RabbitMQ服务器可以组成一个集群,形成一个逻辑消息代理Broker 。
高可用(Highly Avaliable Queues): 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用 。
多种协议(Multi-protocol): 支持多种消息队列协议,核心是AMQP,通过插件形式支持STOMP、MQTT等 。
多种语言客户端(Many Clients): 几乎支持所有常用语言,比如Java、Python、Golang等 。
管理界面(Management UI): 提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面 。
跟踪机制(Tracing): 如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么 。
插件机制(Plugin System): 提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件 。
。
参考 Install Docker Desktop on Mac 安装docker,安装完成后点击Docker图标以启动Docker服务 。
这里简单介绍几个常用的docker命令 。
docker ps -a 可以看到Docker启动过的容器 。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8918b9e8bae2 rabbitmq:3-management "docker-entrypoint.s…" 2 days ago Up 2 days 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp some-rabbit
docker stop CONTAINER ID 停止运行中的容器 。
$ docker stop 8918b9e8bae2
8918b9e8bae2
docker restart CONTAINER ID 重启容器 。
$ docker restart 8918b9e8bae2
8918b9e8bae2
docker exec -it CONTAINER ID /bin/bash 可以进入运行容器的终端 。
$ docker exec -it 8918b9e8bae2 /bin/bash
root@my-rabbit:/#
。
打开终端,在终端中输入 。
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management 。
通过 http://localhost:15672 可以访问管理后台,默认账号和密码均是 guest 。
5672 是 AMQP 0-9-1 使用的端口 。
。
管理后台提供了监控和管理RabbitMQ节点和集群的能力.
管理后台如下图所示 。
通过该管理后台,可以查看当前活跃的Connection, Channel, Exchange, Queue等信息,从图片可以看出当前活跃的Exchange共有7个,具体的类型覆盖了 direct , topic , headers and fanout四种.
通过这个管理后台也可以创建或者删除Connection, Channel, Exchange, Queue 。
。
最后此篇关于RabbitMQ系列-概念及安装的文章就讲到这里了,如果你想了解更多关于RabbitMQ系列-概念及安装的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想读取 RabbitMQ 队列中未确认消息的负载或 messageId。这可能吗? 我想这样做的原因是我尝试使用 RabbitMQ 死信功能来构建一个循环以定期自动生成消息。简而言之,创建两个队列
除了 vFabric 由 VMWare 提供商业支持之外,vFabric RabbitMQ 和 RabbitMQ 之间的主要区别是什么? 最佳答案 来自 source : We also produc
RabbitMQ 集群中有如下三个节点。 在 RabbitMQ 中,有两个队列,q1 和 q2。 q1 和q2 的主副本分布在不同的节点上。两个队列都被其他节点镜像。 三个节点前面有一个负载均衡器。
我希望在谷歌计算引擎上实现 rabbitmq 来处理我的 android 和 ios 消息传递应用程序上的消息。我听说 rabbitmq 可能非常耗电,所以我想知道解决这个问题的最佳解决方案是什么?我
是否可以在 RabbitMQ 服务器(管理插件 View )中查看连接单元的主机名,而不仅仅是 IP/端口?我们使用动态连接位置,这样更容易识别客户...... 最佳答案 不,没有这样的内置功能。 作
我正在阅读 RabbitMQ in Action 书,仍在第 2 章中,但作者说的一件事让我感到困惑。您设置了一个交换并发送了一条消息,两个订阅者正在监听队列。当第一条消息进来时,第一个订阅者得到它,
我正在使用 RabbitMQ 将所有消息排队,并将消息作为 SMS 发送给各个消费者。我正在使用直接交换,并且我已经正确地创建了一个到带有路由键的队列的绑定(bind)。问题是,当我尝试发布消息时,我
我们正在使用微服务架构在 nodejs 中实现 Web-API。每个服务都会公开 HTTP 端点,以便应用程序/网站可以与其交互。为了同步不同的数据库,我们目前使用 RabbitMQ。微服务可以在扇出
我计划在 RabbitMQ 消息头中存储堆栈跟踪。消息 header 是否有大小限制? 最佳答案 RabbitMQ 默认使用 AMQP 版本 0.9.1。根据AMQP protocol specifi
无法理解 exclusive queue 和 exclusive consumer 之间的区别,想知道我是否理解正确。 假设我有一个 queue、consumer1 和 consumer2。 我的理解
发布到 RabbitMQ 队列(发布/订阅模型)时消息的最大大小是多少? 我在文档中看不到任何明确的限制,但我认为有一些指导方针。 提前致谢。 最佳答案 我在做比较亚马逊队列服务和 RabbitMQ
我可以使用 Publish/Subscribe 创建扇出交换RabbitMQ Java 教程,任何连接的消费者都会收到一条消息的副本。我不想以动态/编程方式声明交换和绑定(bind),而是想在连接任何
java的 native rabbitmq客户端允许在连接设置上设置心跳,例如: import com.rabbitmq.client.ConnectionFactory; ... Connectio
我开始着手一个新项目,我们被要求将系统构建为一系列微服务,使用 RabbitMQ 作为它们之间的通信层。 在开发 REST API 时,我倾向于使用接受 HTTP header 来控制版本控制,我看到
在 Rabbit MQ 中使用集群时,我计划使用竞争订阅者模式。 Producer : 1 Exchange : 1 direct Queue : 1 Consumers : n (multiple)
是否可以实现 aggregator pattern在 RabbitMQ 中? 我有 A … N在发送到另一个队列之前我需要等待/聚合的消息 X . 所以我想我会有一些 唯一 ID 确保消息被路由 独家
我正在使用RabbitMQ向用户发送通知。用户可以随时读取其队列。 我面临的问题是,队列在夜间充满了很多通知,而当用户在早上返回时,他必须顺序处理这些消息。这些通知中有很多甚至是重复的。 我认为在发布
是否可以延迟通过 RabbitMQ 发送消息? 例如,我想在 30 分钟后使客户端 session 过期,并且我发送了一条将在 30 分钟后处理的消息。 最佳答案 您可以尝试两种方法: 旧方法:在每个
RabbitMQ 在单个服务器上可以处理的最大队列数是多少? 这取决于内存吗?它取决于 erlang 进程吗? 最佳答案 RabbitMQ 代理内部没有任何硬编码限制。代理将利用所有可用资源(除非您对
RabbitMQ Server 使用或需要在防火墙上为节点集群打开哪些端口? 我的 /usr/lib/rabbitmq/bin/rabbitmq-env 设置如下,我假设需要 (35197)。 SER
我是一名优秀的程序员,十分优秀!