RabbitMQ 集群与高可用方案设计(三)

五、高可用方案设计与实现

(一)负载均衡与代理

1. HAProxy 配置

HAProxy 是一款广泛应用的开源负载均衡器和代理服务器,它能够实现对 RabbitMQ 集群节点的负载均衡和健康检查,有效提高系统的可用性和性能。以下是使用 HAProxy 配置 RabbitMQ 集群负载均衡的详细步骤:

  • 安装 HAProxy:在 Linux 系统上,可以使用包管理器进行安装。例如,在 CentOS 系统中,可以执行以下命令:
 

sudo yum install haproxy

在 Ubuntu 系统中,可以使用以下命令:

 

sudo apt-get install haproxy

  • 配置 HAProxy:HAProxy 的配置文件通常位于/etc/haproxy/haproxy.cfg。打开该文件,进行如下配置:
 

global

# 日志输出配置,将日志输出到本地的syslog

log 127.0.0.1 local0 notice

# 以守护进程方式运行

daemon

# 最大连接数

maxconn 4096

defaults

# 应用全局的日志配置

log global

# 使用TCP模式,因为RabbitMQ使用的是AMQP协议,基于TCP

mode tcp

# 日志类别为tcp

option tcplog

# 不记录健康检查日志信息

option dontlognull

# 连接超时时间

timeout connect 5000

# 客户端超时时间

timeout client 50000

# 服务器端超时时间

timeout server 50000

# 定义一个监听组,用于负载均衡RabbitMQ集群

listen rabbitmq_cluster

# 监听的IP地址和端口,这里监听所有IP的5672端口(可根据实际情况调整)

bind 0.0.0.0:5672

# 使用轮询(roundrobin)负载均衡算法,将请求均匀分配到后端服务器

balance roundrobin

# 配置后端的RabbitMQ集群节点,这里假设有三个节点

server rabbitmq1 192.168.1.10:5672 check inter 5000 rise 2 fall 3

server rabbitmq2 192.168.1.11:5672 check inter 5000 rise 2 fall 3

server rabbitmq3 192.168.1.12:5672 check inter 5000 rise 2 fall 3

# 配置健康检查相关参数

# check:开启健康检查

# inter 5000:每5000毫秒(5秒)检查一次

# rise 2:连续2次检查成功则认为服务器正常

# fall 3:连续3次检查失败则认为服务器不可用

在上述配置中:

  • global部分定义了全局配置参数,如日志输出和运行模式。
  • defaults部分设置了默认的配置选项,包括日志、模式、超时时间等。
  • listen rabbitmq_cluster部分定义了一个监听组,用于对 RabbitMQ 集群进行负载均衡。bind指定了监听的 IP 地址和端口,balance指定了负载均衡算法,server配置了后端的 RabbitMQ 集群节点及其健康检查参数。
  • 启动 HAProxy:完成配置后,使用以下命令启动 HAProxy 服务:
 

sudo systemctl start haproxy

可以使用systemctl status haproxy命令查看服务状态,确保 HAProxy 正常运行。

  • 验证负载均衡效果:通过客户端连接到 HAProxy 的监听地址(如0.0.0.0:5672),发送消息到 RabbitMQ 集群。可以使用抓包工具(如 Wireshark)或者 RabbitMQ 的管理界面来观察消息是否被均匀地分发到不同的 RabbitMQ 节点上,以此验证负载均衡的效果。例如,在 RabbitMQ 的管理界面中,可以查看每个节点的消息接收和处理情况,确认负载是否均衡。

通过以上配置,HAProxy 能够将客户端的请求均匀地分配到 RabbitMQ 集群的各个节点上,实现负载均衡。同时,通过健康检查机制,HAProxy 能够实时监测 RabbitMQ 节点的状态,当某个节点出现故障时,自动将请求转发到其他正常的节点上,从而提高系统的可用性和可靠性。

2. Nginx 作为代理

Nginx 不仅是一个高性能的 HTTP 和反向代理服务器,还可以作为 TCP 代理服务器,用于提高 RabbitMQ 服务的可用性和安全性。通过将 Nginx 作为 RabbitMQ 的代理,可以实现以下功能:

  • 负载均衡:Nginx 支持多种负载均衡算法,如轮询、加权轮询、IP 哈希等。可以根据实际需求选择合适的算法,将客户端请求均匀地分配到 RabbitMQ 集群的各个节点上,提高系统的处理能力和吞吐量。例如,使用轮询算法时,Nginx 会依次将请求分配到每个后端节点,确保每个节点都能得到充分利用;而使用 IP 哈希算法时,Nginx 会根据客户端的 IP 地址计算一个哈希值,然后根据哈希值将请求分配到对应的后端节点,这样可以保证同一客户端的请求始终被路由到同一个节点上,适用于需要保持会话一致性的场景。
  • SSL/TLS 加密:Nginx 可以对客户端和 RabbitMQ 之间的通信进行 SSL/TLS 加密,保护数据在传输过程中的安全性。在生产环境中,尤其是涉及敏感信息的消息传递时,加密通信至关重要。例如,在金融行业的消息队列应用中,订单信息、交易数据等都需要进行加密传输,防止被窃取或篡改。Nginx 可以很方便地配置 SSL 证书,实现对 RabbitMQ 通信的加密。
  • 访问控制:通过 Nginx 的访问控制模块,可以限制对 RabbitMQ 服务的访问,只允许特定的 IP 地址或 IP 段进行连接,增强系统的安全性。例如,在企业内部的消息队列应用中,可以只允许内部服务器的 IP 地址访问 RabbitMQ,防止外部非法访问。可以通过配置 Nginx 的allow和deny指令来实现访问控制。例如:
 

location / {

allow 192.168.1.0/24; # 允许192.168.1.0/24网段的IP访问

deny all; # 拒绝其他所有IP访问

proxy_pass http://rabbitmq_cluster;

}

以下是使用 Nginx 作为 RabbitMQ 代理的基本配置示例:

 

# 定义一个上游服务器组,包含RabbitMQ集群节点

upstream rabbitmq_cluster {

server 192.168.1.10:5672;

server 192.168.1.11:5672;

server 192.168.1.12:5672;

}

server {

listen 5672; # 监听RabbitMQ的端口

location / {

proxy_pass tcp://rabbitmq_cluster; # 将请求代理到RabbitMQ集群

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

# 配置SSL/TLS加密(如果需要)

# ssl on;

# ssl_certificate /path/to/your/cert.pem;

# ssl_certificate_key /path/to/your/key.pem;

}

}

在上述配置中:

  • upstream rabbitmq_cluster定义了一个上游服务器组,包含了 RabbitMQ 集群的三个节点。
  • server块中,listen指定了监听的端口,location /中的proxy_pass将请求代理到rabbitmq_cluster定义的上游服务器组。同时,通过proxy_set_header指令设置了一些代理头信息,以便后端服务器能够获取客户端的真实 IP 地址等信息。如果需要启用 SSL/TLS 加密,可以取消相关配置行的注释,并指定 SSL 证书和密钥的路径。

配置完成后,启动 Nginx 服务:

 

sudo systemctl start nginx

通过将 Nginx 作为 RabbitMQ 的代理,可以有效地提高 RabbitMQ 服务的可用性、安全性和性能,满足不同业务场景的需求。在实际应用中,可以根据具体情况对 Nginx 的配置进行优化和扩展,以实现更强大的功能。

(二)分布式存储与备份

1. 数据持久化策略

RabbitMQ 的数据持久化机制是保证消息可靠性的重要手段,它涉及到消息、队列和元数据的持久化配置。

  • 消息持久化:消息持久化是指将消息存储到磁盘上,而不是仅存储在内存中,这样即使 RabbitMQ 服务器重启或出现故障,消息也不会丢失。在生产者发送消息时,可以通过设置消息的deliveryMode属性为2(持久化)来实现消息的持久化。例如,在 Java 客户端中,可以使用以下代码发送持久化消息:
 

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

import com.rabbitmq.client.MessageProperties;

public class Producer {

public static void main(String[] args) throws Exception {

ConnectionFactory factory = new ConnectionFactory();

factory.setHost("localhost");

try (Connection connection = factory.newConnection();

Channel channel = connection.createChannel()) {

String queueName = "persistent_queue";

// 声明队列,设置为持久化

channel.queueDeclare(queueName, true, false, false, null);

String message = "Persistent message";

// 发送持久化消息,设置deliveryMode为2

channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"));

System.out.println(" [x] Sent '" + message + "'");

}

}

}

在上述代码中,MessageProperties.PERSISTENT_TEXT_PLAIN表示发送的是持久化的文本消息,deliveryMode被设置为2,确保消息在 RabbitMQ 服务器上持久化存储。

  • 队列持久化:队列持久化是指将队列的元数据(如队列名称、属性等)存储到磁盘上,使队列在服务器重启后依然存在。在声明队列时,将durable参数设置为true即可实现队列的持久化。例如,在 Python 客户端中,可以使用以下代码声明一个持久化队列:
 

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

# 声明持久化队列

channel.queue_declare(queue='durable_queue', durable=True)

channel.close()

connection.close()

在上述代码中,durable=True表示队列是持久化的,这样在 RabbitMQ 服务器重启后,该队列仍然存在。

  • 元数据持久化:RabbitMQ 集群中的元数据(包括队列元数据、交换器元数据、绑定元数据和 vhost 元数据)会在节点之间进行同步,并存储在磁盘上。对于普通集群模式,元数据同步确保了各个节点对集群状态的一致认知;在镜像队列模式下,元数据的同步和持久化更是保证了在节点故障时,集群能够快速恢复和切换。例如,当一个新节点加入集群时,它会从其他节点获取元数据信息,从而了解集群中已存在的队列、交换器和绑定关系等,保证集群的正常运行。

需要注意的是,虽然持久化机制能够提高数据的可靠性,但也会带来一定的性能开销。因为将数据写入磁盘的速度比写入内存要慢,所以在对性能要求极高的场景下,需要在可靠性和性能之间进行权衡。例如,在一些对实时性要求非常高的监控系统中,可能会牺牲部分数据可靠性,选择非持久化的方式来提高消息处理的速度;而在订单处理、金融交易等对数据可靠性要求严格的场景中,则必须采用持久化机制来确保数据的完整性和一致性。

2. 异地多活架构

异地多活架构是一种在多个地理位置部署相同的业务系统,使其同时对外提供服务的架构模式。在 RabbitMQ 高可用方案中,应用异地多活架构可以实现跨地域的数据备份和灾难恢复,提高系统的整体可靠性和可用性。

  • 架构原理:异地多活架构通常涉及多个数据中心,每个数据中心都部署有 RabbitMQ 集群。这些集群之间通过网络进行数据同步和通信。当某个数据中心发生故障时,其他数据中心的集群可以继续提供服务,确保业务的连续性。例如,在一个跨国电商公司中,可能在亚洲、欧洲和美洲分别设立数据中心,每个数据中心都有自己的 RabbitMQ 集群。当亚洲数据中心因自然灾害或网络故障无法正常工作时,欧洲和美洲的数据中心可以接管业务,保证订单处理、库存管理等业务的正常进行。
  • 数据同步机制:实现异地多活架构的关键在于数据同步。RabbitMQ 提供了多种数据同步方式,其中常用的是 Federation 和 Shovel 插件。
    • Federation 插件:Federation 插件允许在不同的 RabbitMQ 集群或节点之间建立连接,实现消息的跨集群传输。它可以将一个集群中的队列或交换器的数据同步到另一个集群中,支持多种同步策略,如实时同步、按时间间隔同步等。例如,在一个分布式物流系统中,不同地区的数据中心通过 Federation 插件将本地产生的物流订单消息同步到其他数据中心的 RabbitMQ 集群,确保各个地区都能及时获取最新的订单信息,进行物流配送的安排。
    • Shovel 插件:Shovel 插件可以将消息从一个队列复制到另一个队列,这两个队列可以位于不同的 RabbitMQ 集群中。它支持跨地域的数据复制,并且可以根据配置的规则进行消息的过滤和转换。例如,在一个金融交易系统中,为了实现异地灾备,使用 Shovel 插件将主数据中心 RabbitMQ 集群中的交易消息复制到异地灾备中心的集群中,当主数据中心出现故障时,灾备中心可以凭借复制过去的消息继续处理交易业务,保障金融交易的连续性和数据的完整性。
  • 故障切换与恢复:在异地多活架构中,当某个数据中心的 RabbitMQ 集群出现故障时,需要进行故障切换,将流量切换到其他正常的数据中心。这通常通过 DNS(Domain Name System)解析或负载均衡器来实现。例如,使用智能 DNS,当检测到某个数据中心的 RabbitMQ 服务不可用时,DNS 会将客户端的请求解析到其他正常数据中心的地址上。同时,当故障数据中心恢复后,需要进行数据同步和状态恢复,确保各个数据中心的 RabbitMQ 集群状态一致。例如,在故障数据中心恢复后,通过 Federation 或 Shovel 插件将其他数据中心新增的数据同步回该数据中心,使其恢复到正常的服务状态。

异地多活架构在 RabbitMQ 高可用方案中的应用,能够有效地提高系统的容错能力和抗灾能力,确保在各种复杂情况下,消息队列服务的稳定性和可靠性,为业务的持续发展提供坚实的基础。在实际应用中,需要根据业务的特点和需求,合理选择数据同步方式和故障切换策略,以实现最佳的高可用效果。

六、案例分析与实践经验

(一)实际应用场景案例

  • 电商行业:在某大型电商平台中,RabbitMQ 集群与高可用方案发挥了关键作用。该电商平台每天处理数百万的订单,订单创建、库存更新、物流通知等业务流程都依赖消息队列进行异步通信。通过搭建 RabbitMQ 镜像队列集群,确保了订单消息的可靠存储和处理。即使某个节点出现故障,其他节点上的镜像队列也能迅速接管,保证订单处理的连续性,避免了因消息丢失或服务中断导致的订单处理错误和用户投诉。同时,结合 HAProxy 实现负载均衡,将大量的消息请求均匀分配到各个节点,提高了系统的整体吞吐量,有效应对了促销活动等高峰时段的业务压力。
  • 金融行业:一家金融机构在其核心交易系统中使用 RabbitMQ 来处理交易消息。由于金融交易对数据的准确性和可靠性要求极高,不容许有任何消息丢失或错误处理的情况发生。通过采用异地多活的 RabbitMQ 架构,在不同地理位置的数据中心部署集群,并利用 Federation 插件实现数据同步,实现了跨地域的数据备份和灾难恢复。当某个数据中心因自然灾害、网络故障等原因无法正常工作时,其他数据中心的集群能够立即接管业务,确保交易的正常进行。此外,通过严格配置消息持久化策略,保证了交易消息在任何情况下都不会丢失,满足了金融行业对数据安全和可靠性的严格要求。
  • 物联网行业:在一个智能城市物联网项目中,大量的传感器设备需要将采集到的数据实时传输到后端系统进行分析和处理。RabbitMQ 作为消息队列,负责接收和转发这些海量的传感器数据。由于传感器数量众多,数据产生频率高,对消息队列的吞吐量和可靠性提出了严峻挑战。通过构建 RabbitMQ 普通集群模式,并结合 Nginx 作为代理实现负载均衡和 SSL 加密,有效地解决了高并发数据传输的问题。Nginx 将传感器的连接请求均匀分配到各个 RabbitMQ 节点,同时对数据传输进行加密,保证了数据的安全性。此外,利用 RabbitMQ 的灵活路由机制,根据传感器类型和数据类别将消息准确地路由到相应的处理队列,提高了数据处理的效率,为智能城市的实时监控和决策提供了有力支持。

(二)常见问题与解决方案

  • 节点通信故障:在 RabbitMQ 集群搭建和运行过程中,节点通信故障是较为常见的问题。可能由于网络配置错误、防火墙设置不当、Erlang Cookie 不一致等原因导致节点之间无法正常通信。例如,当不同节点的 Erlang Cookie 不一致时,节点之间的认证会失败,从而无法建立通信连接。解决方案是确保所有节点的 Erlang Cookie 相同,可以通过手动同步 Cookie 文件来解决。同时,检查网络配置和防火墙规则,确保节点之间的通信端口(如 4369、5672 等)畅通。可以使用 ping 命令和 telnet 命令来测试节点之间的网络连通性和端口可用性。如果发现端口被防火墙阻止,需要在防火墙上添加相应的规则,允许节点之间的通信。
  • 消息堆积:消息堆积通常是由于生产者发送消息的速度远大于消费者处理消息的速度,或者消费者出现故障无法正常处理消息导致的。在电商大促活动期间,订单消息量瞬间激增,如果消费者处理能力不足,就会导致消息在队列中大量堆积。解决消息堆积问题可以从多个方面入手:
    • 增加消费者数量:启动更多的消费者实例来并行处理消息,提高消息处理的速度。可以通过在消费者端配置多个并发消费者来实现,例如在 Spring AMQP 中,可以设置 SimpleMessageListenerContainer 的 concurrentConsumers 属性来增加并发消费者的数量。
    • 优化消费者代码:对消费者中的业务逻辑进行性能分析,找出耗时的操作并进行优化。例如,如果消费者在处理消息时需要频繁查询数据库,可以优化数据库查询语句,添加合适的索引,减少查询时间;如果是复杂的计算逻辑,可以考虑使用更高效的算法或者并行计算(如果适用)来提高处理效率。
    • 调整预取计数(Prefetch Count):通过设置 Quality of Service(QoS)中的 basic.qos 值,限制每个消费者一次从 RabbitMQ 中拉取的消息数量,避免消费者因拉取过多消息而导致处理不过来,同时也能保证其他消费者有机会获取消息进行处理,从而平衡消费者的负载。
    • 设置过期时间(TTL)和死信队列(DLX):对于时效性不强的消息,可以设置消息的过期时间(TTL),当消息在队列中停留超过过期时间后,会被自动删除,避免消息长期堆积占用资源。同时,可以结合死信队列,当消息过期或处理失败时,将其路由到死信队列中,以便后续分析和处理,防止这些消息阻塞正常的消息流。
  • 内存使用过高:RabbitMQ 在运行过程中,如果队列中的消息数量过多、消息体过大,或者内存回收机制配置不当,可能会导致内存使用过高,甚至出现内存溢出的情况。这会严重影响 RabbitMQ 的性能和稳定性。解决内存使用过高的问题,可以采取以下措施:
    • 优化消息存储:合理设置消息的持久化策略,对于一些不重要的消息,可以选择不进行持久化,减少磁盘 I/O 和内存占用。同时,定期清理过期的消息和队列,释放内存空间。
    • 调整内存回收参数:可以通过修改 RabbitMQ 的配置文件,调整内存回收的相关参数,如内存高水位线(Memory High Watermark)等。当内存使用达到高水位线时,RabbitMQ 会采取相应的措施,如限制生产者发送消息的速度,以防止内存进一步升高。
    • 使用惰性队列(Lazy Queues):对于不在活跃节点上的消息,可以启用惰性队列。惰性队列将消息存储在磁盘上,只有当消费者请求消息时,才会将消息从磁盘加载到内存中,这样可以大大减少内存的使用,降低内存压力。

七、未来展望与技术趋势

随着技术的不断发展,RabbitMQ 在云原生、容器化部署等方面展现出了显著的发展趋势,这些趋势不仅影响着 RabbitMQ 自身的演进,也对分布式系统的消息通信产生了深远的影响。

(一)云原生与容器化部署

在云原生时代,容器化技术成为了主流的应用部署方式。RabbitMQ 与容器化技术的深度融合是未来的重要发展方向。通过将 RabbitMQ 部署在容器中,利用容器编排工具(如 Kubernetes)进行管理,可以实现更高效的资源利用、弹性扩展和自动化运维。在 Kubernetes 环境中,可以轻松地根据业务负载动态调整 RabbitMQ 集群的节点数量,当业务量增加时,自动添加新的节点以提高处理能力;当业务量减少时,自动缩减节点数量,避免资源浪费。同时,容器化部署还能提高环境的一致性和可重复性,降低部署和运维的复杂度。

(二)与云服务的集成

越来越多的企业选择将应用迁移到云端,RabbitMQ 与云服务的集成也变得愈发紧密。各大云服务提供商纷纷推出了基于 RabbitMQ 的托管服务,如 AWS 的 Amazon MQ for RabbitMQ、Google Cloud 的 Cloud Pub/Sub(基于 RabbitMQ 技术)等。这些托管服务提供了便捷的部署、管理和监控功能,降低了企业使用 RabbitMQ 的门槛。企业无需自行搭建和维护 RabbitMQ 集群,只需通过云服务平台进行简单的配置,就可以快速使用 RabbitMQ 服务,同时还能享受到云服务提供商提供的高可用性、数据备份、安全防护等一系列服务,大大提高了系统的可靠性和稳定性。

(三)自动化运维与监控

未来,RabbitMQ 的运维将更加自动化和智能化。通过集成各种监控工具和自动化运维平台,可以实时监测 RabbitMQ 集群的运行状态,包括节点的健康状况、消息队列的堆积情况、内存和 CPU 的使用情况等。一旦发现异常,能够及时发出警报,并自动采取相应的措施进行处理,如自动重启故障节点、调整队列的参数等。一些自动化运维工具还可以根据历史数据进行分析和预测,提前发现潜在的问题,为系统的稳定运行提供保障。

(四)性能优化与功能扩展

随着业务需求的不断增长,对 RabbitMQ 的性能和功能也提出了更高的要求。未来,RabbitMQ 将继续在性能优化方面进行努力,如进一步提高消息的处理速度、降低延迟、优化内存管理等。同时,也会不断扩展其功能,以满足更多复杂场景的需求。在物联网场景中,支持更多的物联网协议,实现与各种物联网设备的无缝连接;在大数据领域,与大数据处理框架(如 Apache Kafka、Spark 等)进行更好的集成,实现消息数据的实时处理和分析。

RabbitMQ 在未来的发展中,将紧密结合云原生、容器化等技术趋势,不断提升自身的性能和功能,为分布式系统的消息通信提供更加可靠、高效的解决方案。企业在应用 RabbitMQ 时,也应关注这些技术趋势,合理利用 RabbitMQ 的新特性,优化系统架构,以适应不断变化的业务需求。

八、结论

在分布式系统的消息通信领域,RabbitMQ 凭借其强大的功能和丰富的特性,成为了众多开发者的首选消息队列系统。通过深入研究 RabbitMQ 集群与高可用方案,我们了解到这些技术对于保障系统的稳定性、可靠性和高性能至关重要。

普通集群模式利用 Erlang 语言的分布式特性,实现了节点之间的元数据同步,虽然消息数据仅存储在单个节点,但在一定程度上提高了系统的吞吐量和资源利用率,适用于对消息可靠性要求相对较低、更注重性能和成本的场景。而镜像队列模式则在普通集群模式的基础上,通过将队列数据复制到多个节点,实现了高可用性,确保在节点故障时消息的可靠存储和处理,满足了对数据可靠性和服务连续性要求极高的业务场景。

为了进一步提升 RabbitMQ 集群的可用性和性能,我们探讨了负载均衡与代理、分布式存储与备份等高可用方案。HAProxy 和 Nginx 作为常用的负载均衡和代理工具,能够将客户端请求均匀分配到集群节点,实现负载均衡,并提供健康检查、SSL/TLS 加密和访问控制等功能,增强了系统的安全性和稳定性。在分布式存储与备份方面,合理配置数据持久化策略,结合异地多活架构和数据同步机制,有效保障了数据的可靠性和灾难恢复能力,确保在各种复杂情况下系统的正常运行。

通过实际案例分析,我们看到 RabbitMQ 集群与高可用方案在电商、金融、物联网等多个行业的成功应用,解决了这些行业在消息通信方面面临的诸多挑战。同时,我们也总结了在实际应用中可能遇到的问题及相应的解决方案,为开发者在实践中提供了有益的参考。

展望未来,随着云原生、容器化技术的不断发展,RabbitMQ 将与这些技术更加紧密地融合,实现更高效的部署、管理和运维。与云服务的集成也将进一步降低企业使用 RabbitMQ 的门槛,提供更便捷、可靠的消息队列服务。自动化运维与监控技术的应用将使 RabbitMQ 集群的管理更加智能化,能够及时发现和解决潜在问题,保障系统的稳定运行。在性能优化和功能扩展方面,RabbitMQ 也将不断演进,以满足日益增长的业务需求。

希望读者在阅读本文后,能够对 RabbitMQ 集群与高可用方案有更深入的理解,并将这些知识应用到实际项目中。在实践过程中,不断总结经验,根据业务的特点和需求,灵活选择和优化 RabbitMQ 的集群架构和高可用方案,为分布式系统的消息通信提供坚实可靠的支撑,助力业务的持续发展和创新。

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

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

相关文章

机器学习第二十四讲:scikit-learn → 机器学习界的瑞士军刀

机器学习第二十四讲:scikit-learn → 机器学习界的瑞士军刀 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 Scikit-…

百度ocr的简单封装

百度ocr地址 以下代码为对百度ocr的简单封装,实际使用时推荐使用baidu-aip 百度通用ocr import base64 from enum import Enum, unique import requests import logging as logunique class OcrType(Enum):# 标准版STANDARD_BASIC "https://aip.baidubce.com/rest/2.0…

Ubuntu20.04 gr-gsm完整安装教程

gr-gsm完整安装教程 安装gnuradio3.8安装依赖项指定gnuradio源安装gnuradio 安装gr-gsm安装依赖项安装gr-gsm修改环境变量 安装成功 安装gnuradio3.8 安装依赖项 sudo apt install git cmake g libboost-all-dev libgmp-dev swig python3-numpy python3-mako python3-sphinx …

(自用)Java学习-5.15(模糊搜索,收藏,购物车)

1. 模糊搜索商品功能 前端实现: 通过解析URL参数(如search联想)获取搜索关键字,发送AJAX GET请求到后端接口/product/searchGoodsMessage。 动态渲染搜索结果:若结果非空,循环遍历返回的商品数据&#xff…

STM32 TIM 定时器深度剖析:结构、时基、中断与应用开发(超形象详解)

文章目录 定时器(TIM)定时器种类与分布定时器的基本结构时基单元时基单元基本结构计数器计数方向时基单元时钟来源计算寄存器预加载机制 自制延时函数获取单片机当前时间实现延迟函数初始化定时器3的时基单元配置中断编写中断响应函数测试延迟函数 定时器…

Java使用minio上传整个目录下的所有内容

目录 1、添加相关配置 2、添加依赖 3、实现方法 1️⃣基础版: 2️⃣优化版(推荐使用): 3️⃣上传远程主机上的目录内容: 4️⃣直接上传远程主机中的目录内容 业务背景:需要需要minio进行上传指定目录下所有…

Python的分布式网络爬虫系统实现

1. 系统架构概述 一个典型的分布式网络爬虫系统通常包含以下几个核心组件: 1.主节点(Master Node): 任务调度:负责将抓取任务分配给各个工作节点。URL 管理:维护待抓取的 URL 队列和已抓取的 URL 集合&a…

AI工具的选择:Dify还是传统工具?

从纯技术视角出发,选择Dify还是传统开发工具需要基于六个核心维度进行理性决策。以下为结构化分析框架,附典型场景示例: 1. 开发效率 vs 控制力权衡矩阵 维度Dify优势场景传统工具优势场景迭代速度需求明确的标准CRUD(如后台管理…

2.3 TypeScript 非空断言操作符(后缀 !)详解

在 TypeScript 中,当你开启了严格的空值检查(strictNullChecks)后,变量如果可能是 null 或 undefined,就必须在使用前进行显式的判断。为了在某些场景下简化代码,TypeScript 提供了非空断言操作符&#xff…

深度学习:损失函数与激活函数全解析

目录 深度学习中常见的损失函数和激活函数详解引言一、损失函数详解1.1 损失函数的作用与分类1.2 回归任务损失函数1.2.1 均方误差(MSE)1.2.2 平均绝对误差(MAE) 1.3 分类任务损失函数1.3.1 交叉熵损失(Cross-Entropy&…

掌握 npm 核心操作:从安装到管理依赖的完整指南

图为开发者正在终端操作npm命令,图片来源:Unsplash 作为 Node.js 生态的基石,npm(Node Package Manager)是每位开发者必须精通的工具。每天有超过 1700 万个项目通过 npm 共享代码,其重要性不言而喻。本文…

Elasticsearch的运维

Elasticsearch 运维工作详解:从基础保障到性能优化 Elasticsearch(简称 ES)作为分布式搜索和分析引擎,其运维工作需要兼顾集群稳定性、性能效率及数据安全。以下从核心运维模块展开说明,结合实践场景提供可落地的方案…

国产三维CAD皇冠CAD(CrownCAD)建模教程:汽车电池

在线解读『汽车电池』的三维建模流程,讲解3D草图、保存实体、拉伸凸台/基体、设置外观等操作技巧,一起和皇冠CAD(CrownCAD)学习制作步骤吧! 汽车电池(通常指铅酸蓄电池或锂离子电池)是车辆电气系…

深入理解 JDK、JRE 和 JVM 的区别

在 Java 中,JDK、JRE 和 JVM 是非常重要的概念,它们各自扮演着不同的角色,却又紧密相连。今天,就让我们来详细探讨一下它们之间的区别。 一、JVM JVM 即 Java 虚拟机,它是整个 Java 技术体系的核心。JVM 提供了 Java…

云电脑显卡性能终极对决:ToDesk云电脑/顺网云/海马云,谁才是4K游戏之王?

一、引言 1.1 云电脑的算力革命 云电脑与传统PC的算力供给差异 传统PC的算力构建依赖用户一次性配置本地硬件,特别是CPU与显卡(GPU)。而在高性能计算和游戏图形渲染等任务中,GPU的能力往往成为决定体验上限的核心因素。随着游戏分…

撤销Conda初始化

在安装miniconda3的过程中,最后系统会出现这一行提示用户可以选择自动初始化,这样的话,系统每次启动就会自动启动基础(base)环境。 但是我们也可以通过 conda init --reverse $shell 来撤销 Conda 的初始化设置。这将恢…

Flask-SQLAlchemy数据库查询:query

1、为什么可以用 模型类.query 来查询数据库? 在 Flask 中使用 SQLAlchemy ORM 时,所有继承自 db.Model 的模型类都会自动获得一个 query 属性。 其本质是 db.session.query(模型类) 的快捷方式,无需显式操作 db.session。 代码示例&#…

【免费】【无需登录/关注】度分秒转换在线工具

UVE Toolbox 功能概述 这是一个用于地理坐标转换的在线工具,支持两种转换模式: 十进制度 → 度分秒 度分秒 → 十进制度 使用方法 十进制度转度分秒 在"经度"输入框中输入十进制度格式的经度值(例如:121.46694&am…

怎么判断一个Android APP使用了React Native 这个跨端框架

要判断一个 Android 应用是否使用了 React Native 框架,可以通过以下方法逐步验证: 一、安装包结构分析 1. 解压 APK 将 .apk 文件重命名为 .zip 并解压,检查以下特征文件: • assets/index.android.bundle: React Na…

Pluto实验报告——基于2ASK的简易的通信系统

一、实验目的 1. 熟悉并掌握PLUTO SDR 主动学习模块的使用; 2.通过matlab 编码与adalm pluto 相配合达成一个简易的通信系统,并能 够传输一些较为简单的信息。 二、实验原理 2ASK 调制原理: 振幅键控是指利用载波的振幅变化来传递数字基带信…