当前位置: 首页 > news >正文

RabbitMQ 深度解析:从基础到高级应用的全面指南


🐰 RabbitMQ 深度解析:从基础到高级应用的全面指南

  • 前言
  • 📘 一、RabbitMQ 简介
  • ⚙️ 二、核心特性
    • 可靠性 🔒
    • 灵活路由 🔄
    • 高可用性 🌐
    • 多协议支持 🌍
    • 多语言客户端 💻
    • 插件机制 🔌
  • 🧩 三、应用场景
  • 🧭 四、核心原理与架构设计
  • 🚀 五、核心特点
  • 🛡️ 六、高可用性、高并发、高性能与容灾策略
  • 🔐 七、安全问题
  • 🛠️ 八、生产环境的推荐配置
  • 🔄 九、与其他技术的对比
  • ⚠️ 十、常见问题及注意事项
  • 总结


前言

RabbitMQ 是一款广泛使用的开源消息队列中间件,基于 AMQP(高级消息队列协议)标准实现,采用 Erlang 语言编写,具备高可靠性、高性能和高可用性等特点。本文将从基础知识到高级应用,深入探讨 RabbitMQ 的各个方面,帮助读者全面理解其工作原理和最佳实践。

在这里插入图片描述


📘 一、RabbitMQ 简介

RabbitMQ 是由 Erlang 语言开发的开源消息代理软件,遵循 AMQP 协议,旨在实现高可靠、高性能的消息传递。它在分布式系统中充当消息中间件,负责在生产者和消费者之间传递消息,广泛应用于异步处理、系统解耦和流量削峰等场景。

⚙️ 二、核心特性

可靠性 🔒

RabbitMQ 的可靠性特性确保了消息在传递过程中不会丢失,即使在故障发生时,也能确保数据的完整性和一致性。

  • 消息持久化

    • 持久化消息:RabbitMQ 提供持久化选项,允许将消息持久化到磁盘,以保证即使 RabbitMQ 服务器宕机或重启,消息也不会丢失。

    • 队列与交换机持久化:除了消息本身外,队列和交换机也可以配置为持久化。只有在队列或交换机被设置为持久化时,重启 RabbitMQ 后才会恢复其状态。

    • 优化建议:在高可靠性需求的场景中,应确保消息、队列、交换机均为持久化配置,但需要注意持久化带来的性能开销,特别是在高吞吐量的应用中。可以考虑使用 磁盘优先级队列 来优化持久化消息的存储。

  • 发送应答与发布确认

    • 生产者确认机制:RabbitMQ 提供生产者确认机制(Publisher Confirms),可以确保消息已成功接收并持久化。生产者会接收到消息是否成功存入队列的确认信号。

    • 消费者应答机制:消费者在处理完消息后发送应答,确保消息已被成功消费。消息未确认会被重新投递给其他消费者。

    • 优化建议:在高可靠性应用中,建议开启生产者确认和消费者应答机制,避免消息丢失。但需要注意,该机制可能会引入一些延迟,尤其是在高并发场景下。

  • 高可用性

    • 集群与镜像队列:通过集群和镜像队列机制,RabbitMQ 能确保即使单个节点发生故障,消息也能在其他节点上继续处理,保证系统的高可用性。

    • 优化建议:建议使用 Quorum Queues 代替传统的镜像队列,它通过共识算法来保证消息的可靠性和一致性,避免传统镜像队列中潜在的同步问题。

灵活路由 🔄

RabbitMQ 的消息路由功能非常灵活,支持多种交换机类型,可以根据不同的业务场景灵活配置消息路由规则。

  • 交换机类型

    • Direct Exchange:通过精确匹配路由键,将消息发送到指定队列。适合点对点的消息传递。

    • Fanout Exchange:将消息广播到所有绑定的队列,忽略路由键。适合广播类型的应用场景。

    • Topic Exchange:基于路由键模式进行路由,能够进行模糊匹配。适合需要路由键模式灵活控制的场景。

    • Headers Exchange:根据消息头部信息进行路由。适合基于自定义头部字段的路由规则。

    • 优化建议:选择合适的交换机类型时,应根据业务需求和消息流的特点来决定。例如,对于需要灵活匹配路由的场景,使用 Topic Exchange,而对于简单广播场景,则使用 Fanout Exchange。

  • 消息路由策略

    • 死信交换机(DLX):RabbitMQ 支持配置死信交换机,未消费的消息或超时消息可以自动转发到另一个交换机,从而实现消息的死信处理。

    • 优先级队列:RabbitMQ 支持优先级队列,消息根据优先级顺序进行消费。可以帮助在高并发的情况下保证关键消息的优先处理。

    • 优化建议:使用死信交换机和优先级队列时,需综合考虑消息的重要性和处理时效,避免过度使用这些机制造成系统性能下降。

高可用性 🌐

RabbitMQ 提供多种高可用性机制,确保系统能够在故障发生时迅速恢复,并保证消息的可靠传递。

  • 集群部署

    • RabbitMQ 允许将多个节点组成集群,集群节点共享队列信息,从而实现负载均衡和高可用性。

    • 优化建议:在集群部署时,建议使用多个数据中心来部署 RabbitMQ 节点,以提高容灾能力。可以使用 RabbitMQ Federation 插件将跨数据中心的集群进行连接。

  • 队列镜像

    • 通过镜像队列,RabbitMQ 能够将队列复制到多个节点。即使某个节点发生故障,其他节点也可以继续提供服务。

    • 优化建议:镜像队列带来一定的性能开销,应根据业务需要合理配置镜像队列的数量。在高可靠性需求场景下,使用 Quorum Queues 比传统镜像队列更可靠。

多协议支持 🌍

RabbitMQ 不仅支持 AMQP 协议,还支持其他协议,扩展了其应用场景。

  • AMQP协议:RabbitMQ 默认遵循 AMQP(高级消息队列协议),该协议是工业标准,广泛应用于消息队列系统中。

  • 支持其他协议:RabbitMQ 支持多个协议插件,如 STOMPMQTTAMQP 1.0 等。这使得它能够支持物联网(IoT)和轻量级消息传递系统等应用场景。

    • 优化建议:根据不同的应用需求选择合适的协议,如果是物联网应用,可以选择 MQTT;如果是需要与其他 AMQP 系统互通,可以选择 AMQP 1.0。

多语言客户端 💻

RabbitMQ 提供了广泛的客户端支持,方便开发者在多种编程语言中集成消息队列功能。

  • 支持语言:RabbitMQ 提供 Java、Python、.NET、Go、Node.js 等多种语言的客户端,开发者可以根据项目的技术栈选择合适的客户端。

    • 优化建议:根据开发团队的技术栈选择最合适的客户端,避免使用过于复杂的客户端库带来不必要的维护负担。

插件机制 🔌

RabbitMQ 的插件机制为系统的扩展和功能定制提供了极大的灵活性。通过插件,可以增强 RabbitMQ 的功能,满足不同的业务需求。

  • 常用插件

    • RabbitMQ Management Plugin:提供 Web 管理界面,便于监控和管理 RabbitMQ 系统。

    • Shovel 插件:用于跨 RabbitMQ 实例之间复制消息,帮助实现消息的迁移和备份。

    • Federation 插件:支持跨多个 RabbitMQ 实例和数据中心的消息传递,增强跨地理位置的系统集成能力。

    • 优化建议:合理选择插件使用,避免过度使用不必要的插件,特别是在性能要求较高的场景中。定期清理和更新插件,以确保系统的稳定性和安全性。

🧩 三、应用场景

  1. 异步处理

    • 场景描述:在许多应用中,某些任务的处理时间较长(例如图像处理、视频转码、大数据计算等),如果将这些任务放在主线程中进行同步处理,可能会导致系统响应缓慢或超时。通过使用 RabbitMQ,将这些耗时任务放入消息队列,交由后台进程异步处理,可以有效避免主线程的阻塞。

    • 优化方式:通过 RabbitMQ,可以在任务量较大的情况下平衡负载,保证主线程可以持续响应用户请求,并在后台处理任务,最终将结果返回给用户。

    • 技术优势

      • 增强系统的响应能力。

      • 通过控制任务队列大小,避免后台任务造成的系统负载过高。

      • 异常任务的隔离性,避免某个任务影响整个系统。

  2. 流量削峰

    • 场景描述:在高并发的场景中,尤其是电商、支付系统等,需要处理大量用户请求。短时间内大量请求会对数据库、应用服务器造成极大的压力,可能导致服务不可用或响应延迟。使用 RabbitMQ 可以平缓流量,将短时间内的请求通过消息队列排队,按顺序逐步消费。

    • 优化方式:通过使用 RabbitMQ,可以将突发的高并发请求分散到一段时间内进行处理,避免瞬时大量请求对系统造成压力。

    • 技术优势

      • 流量平滑:控制队列长度,逐步消费高峰期间积累的请求。

      • 负载均衡:通过消费者池动态调整处理能力,以应对高并发负载。

      • 容错性:消息队列能保证即使消费者暂时不可用,消息也不会丢失,待消费者恢复后继续处理。

  3. 系统解耦

    • 场景描述:在传统的单体架构中,各个模块之间的紧密耦合会导致系统的扩展性差、维护困难。而通过 RabbitMQ 的引入,可以将系统中各个模块(如支付模块、库存模块、用户通知模块等)解耦,使得模块之间通过异步消息传递进行通信。这种解耦方式使得每个模块都可以独立部署、扩展和维护。

    • 优化方式:使用 RabbitMQ,将不同模块之间的依赖转换为消息传递的关系。模块之间无需直接调用和依赖,只通过发送消息实现数据和事件的传递。

    • 技术优势

      • 提高灵活性:模块间没有直接依赖,可以独立修改或扩展,减少了系统的复杂性。

      • 易于扩展:新增模块时,可以直接通过消息队列与现有系统进行集成,而不需要对现有模块进行大的调整。

      • 系统可维护性:通过日志和消息队列监控系统状态,更容易定位和解决问题。

  4. 日志收集与监控

    • 场景描述:在大规模的分布式系统中,各个服务模块产生的日志需要集中收集、处理和分析,以便于实时监控、故障排查和性能优化。通过 RabbitMQ,系统中的各个服务可以将日志消息发送到队列,进一步通过日志消费服务(如 ELK Stack、Fluentd 等)进行集中存储和处理。

    • 优化方式:通过 RabbitMQ 作为日志消息的传递层,确保日志能够快速、可靠地传输到集中式日志系统,而不会影响业务请求的性能。

    • 技术优势

      • 高可用性:即使日志消费系统遇到故障,消息也不会丢失,可以在系统恢复后继续处理。

      • 实时性:通过异步传递日志消息,能够实时捕捉和处理系统日志,及时发现并响应潜在问题。

      • 扩展性:随着系统规模的扩大,能够轻松通过增加消费者节点来提升日志处理能力。

  5. 事件驱动架构

    • 场景描述:在微服务架构中,各个服务之间通常需要通过事件来进行通信,如用户注册、支付成功、库存更新等。RabbitMQ 可以作为微服务之间事件传递的桥梁,确保各个服务之间的通信高效、可靠,并且能处理复杂的事件路由需求(如条件匹配、事件广播等)。

    • 优化方式:通过将各个服务的关键事件通过 RabbitMQ 发布至消息队列,其他相关服务(如通知服务、库存服务等)可以订阅并消费这些事件。通过事件驱动,系统能够实现松耦合,并且支持异步处理,提升系统的灵活性。

    • 技术优势

      • 松耦合:服务之间通过 RabbitMQ 传递事件,避免了服务间的直接依赖,提高了系统的灵活性和可维护性。

      • 可扩展性:随着新服务的增加,新的消费者可以订阅和处理事件,而不需要修改现有服务的代码。

      • 可靠性:通过消息持久化和确认机制,确保事件传递的可靠性,避免消息丢失。

🧭 四、核心原理与架构设计

  1. 消息传递模型 📨

    • 生产者(Producer):生产者是消息的发送方,它生成消息并将其发布到指定的交换机。生产者并不关心消息最终被送到哪个队列,只有交换机和队列之间的路由规则决定了消息的最终去向。生产者发送的消息可以设置为持久化,确保即使 RabbitMQ 服务重启,消息依然不会丢失。

      • 技术优化

        • 生产者可以利用 RabbitMQ 的 确认机制(Publisher Confirms)确保消息已成功发送到队列或交换机。

        • 可以设置消息的持久化级别,以便即使服务器崩溃,消息也能保留。

    • 消费者(Consumer):消费者从队列中获取消息并进行处理,处理完消息后返回确认应答(ACK)。如果消费者处理消息失败,则可以配置自动重试或将消息发送到死信队列(DLQ)进行进一步处理。

      • 技术优化

        • 消费确认:消费者在成功处理消息后发送确认信号,确保消息被处理且不会丢失。

        • 自动应答与手动应答:根据业务需求,可以选择自动应答或手动应答,手动应答有助于确保消息被成功处理后才会从队列中移除。

  2. 交换机类型 🔄

    RabbitMQ 支持多种交换机类型,每种类型适用于不同的路由策略:

    • Direct Exchange:基于消息的路由键(Routing Key)将消息路由到匹配的队列。只有当队列的绑定键与消息的路由键完全匹配时,消息才会发送到该队列。

      • 场景应用:适用于一对一的消息传递场景,确保只有特定的消费者能够接收到特定的消息。例如,日志记录服务、任务分配系统等。
    • Fanout Exchange:将消息广播到所有绑定的队列,而不考虑路由键。每个绑定到 Fanout Exchange 的队列都会收到该消息。

      • 场景应用:适用于广播类型的应用场景,如发布-订阅模式,多个消费者需要处理相同消息的场景。例如,新闻推送服务、通知系统等。
    • Topic Exchange:根据路由键的模式(通配符匹配)进行消息路由。可以实现复杂的消息路由规则,支持部分或完全匹配。

      • 场景应用:适用于复杂的路由需求。例如,某些消费者可能只关心特定主题或特定标签的消息,可以通过主题匹配来过滤消息。这类模式常见于日志服务、事件驱动架构等。
    • Headers Exchange:根据消息头部的属性进行路由,消息的头部属性可以任意配置,交换机会根据这些头部信息决定消息的路由。

      • 场景应用:适用于对消息进行复杂条件判断的场景,如根据消息的特定元数据(如版本号、优先级等)进行路由。适合需要根据多个属性判断消息走向的情况。
  3. 队列与消息存储 💾

    • 持久化队列:默认情况下,RabbitMQ 的队列是非持久化的,这意味着当 RabbitMQ 服务重启时,队列中的消息会丢失。为了避免数据丢失,队列和消息可以被标记为持久化,确保消息在服务器重启时依然保留。

      • 技术优化

        • 消息持久化:在生产者发送消息时,可以选择将消息持久化到磁盘。这样即使 RabbitMQ 服务崩溃,消息仍然不会丢失。

        • 队列持久化:队列本身也可以是持久化的,这样即使 RabbitMQ 重启,队列和其中的消息仍能保留。

    • 消息TTL(Time-to-Live)与死信队列(DLQ)

      • 消息TTL:每条消息都可以设置一个有效期(TTL)。消息超时后会被自动丢弃或者转移到死信队列(DLQ)中。这有助于避免队列中的过期或无用消息堆积。

      • 死信队列(DLQ):未被消费的消息(如过期的消息或因消费者处理失败的消息)可以被发送到死信队列。DLQ 提供了一个可靠的备份,确保无论消息是否被成功消费,它们都能得到处理。

      • 技术优化

        • 死信处理:可以通过设置队列的死信交换机(DLX)来配置消息转移到其他队列,便于进行故障排查、重新投递或人工干预。

        • TTL配置:合理配置消息的 TTL,确保队列中只有有效的消息,避免积压不必要的消息,影响系统的性能。

  4. 优化与扩展建议

    • 负载均衡与弹性扩展:在高负载场景下,合理配置消费者数量,确保系统在面对大规模消息时能够平稳运行。通过 RabbitMQ 的集群功能,可以在多个节点之间分担消息负载,提高处理能力。

    • 性能监控与调优:利用 RabbitMQ 提供的管理插件,可以实时监控队列、消费者的处理状态以及消息传递的延迟。结合系统负载情况,可以动态调整消费者的数量和预取值,优化队列处理能力。

    • 高可用部署:通过设置队列镜像、集群部署等方式,确保 RabbitMQ 服务的高可用性。通过在不同的数据中心部署 RabbitMQ,可以提高系统的容灾能力。

🚀 五、核心特点

  1. 高吞吐量与低延迟 📊

    RabbitMQ 采用了高效的消息传递机制,能够在高并发的环境下传递大量的消息,并保持低延迟。其通过以下几个方面优化了吞吐量和响应时间:

    • 预取机制(Prefetch):通过合理设置消费者的预取值(即每个消费者最多能处理多少条消息),可以优化消息分发和消费者的负载均衡。适当的预取值可以减少消息传递的延迟,同时避免消费者过载。

    • 异步消息传递:RabbitMQ 支持异步模式的消息传递,这意味着生产者发送消息时不会被阻塞,可以立即进行下一轮操作,极大地提高了吞吐量。

    • 优化路由和队列管理:通过合理的交换机与队列配置,RabbitMQ 能够在高并发情况下优化消息传递路径,减少不必要的路由和中间环节。

      • 技术优化

        • 调整 消息批量确认(Batch Acknowledgments)和 流控机制(Flow Control)以提高处理效率,避免过度积压。

        • 使用 快速队列负载均衡 策略来保证每个消费者能高效处理消息。

  2. 高可靠性与容错性 🔒

    • RabbitMQ 通过多种机制确保消息的可靠性和容错能力,减少系统故障对消息传递的影响:

    • 消息持久化:生产者可以选择将消息持久化到磁盘上,这样即使 RabbitMQ 服务崩溃,消息也不会丢失。

    • 确认机制:RabbitMQ 提供了 Publisher ConfirmsConsumer Acknowledgments,确保消息被成功传递和消费。生产者可以在发送消息后,等待服务器的确认信号来确保消息已成功写入队列。

    • 队列镜像:RabbitMQ 提供 队列镜像(Mirrored Queues)功能,将队列的数据复制到多个节点。当某个节点发生故障时,其他节点的副本可以继续提供服务,确保高可用性。

      • 技术优化

        • 配置合适的 消息确认级别,平衡性能与可靠性。

        • 结合 持久化队列队列镜像,确保消息的持久性和系统的高可用性。

  3. 集群化与高可用性 🌐

    • RabbitMQ 提供了强大的集群支持,确保系统能够在高负载、高并发情况下保持高可用性,即使部分节点故障,系统也能够持续运行。

      • 集群部署:通过将多个 RabbitMQ 节点组成集群,RabbitMQ 能够分担消息处理负载,避免单点故障。

      • 队列镜像:通过将队列的数据复制到集群中的其他节点,RabbitMQ 提供了容灾能力。即便某些节点发生故障,队列的消息仍然能在其他节点上进行消费。

      • 分布式环境支持:RabbitMQ 能够在跨数据中心或多云环境中工作,利用不同节点的地理分布来实现故障转移和负载均衡,进一步提升可用性和容错性。

        • 技术优化

          • 通过合理配置 集群节点节点间的复制机制,确保消息传递的高可用性。

          • 配置 镜像队列,确保所有重要数据都有备份,防止单节点故障带来的影响。

  4. 灵活配置与扩展 ⚙️

    RabbitMQ 提供了高度的灵活性,能够根据不同的业务需求和技术栈进行配置与扩展:

    • 多种交换机与路由机制:根据业务需求,RabbitMQ 支持多种类型的交换机(Direct、Fanout、Topic、Headers),可以灵活地配置消息的路由规则,满足不同场景下的消息传递需求。

    • 插件扩展:RabbitMQ 提供了丰富的插件扩展,涵盖了监控、管理、协议转换等多个方面。例如,Shovel 插件可用于将消息从一个 RabbitMQ 集群传输到另一个,Federation 插件支持跨集群通信。

    • 多语言支持:RabbitMQ 提供多种语言的客户端库(如 Java、Python、.NET 等),可以适应不同技术栈的需求。

    • 基于策略的队列配置:可以通过策略(如 TTL、最大消息数、最大队列长度 等)来精细化控制队列行为,优化资源使用,避免消息堆积。

      • 技术优化

        • 根据不同的 业务需求 配置合适的交换机和队列数量,避免不必要的资源消耗。

        • 合理设置 队列策略,如 队列消息大小限制、过期消息丢弃策略,以确保系统在高负载情况下依然能正常运行。

🛡️ 六、高可用性、高并发、高性能与容灾策略

  1. 高可用性 🌐

    为了确保系统在不同故障情况下都能持续运行,RabbitMQ 提供了高可用性机制,主要通过集群和队列镜像来实现。

    • 集群部署

      • RabbitMQ 支持多个节点组成集群,可以将负载分担到不同的节点上,从而提高系统的 可用性容错性

      • 集群节点间共享队列元数据,当一个节点发生故障时,其他节点可以接管任务。

      • 优化建议:建议在集群部署时使用多个数据中心部署集群节点,以避免单点故障的风险。可以使用 RabbitMQ Federation 插件在不同数据中心之间实现集群联动。

    • 队列镜像

      • 队列镜像(Mirrored Queues)是确保消息可靠传递的关键。RabbitMQ 允许将队列的副本(镜像)同步到多个节点。当一个节点出现故障时,其他节点仍然能够接管该队列,确保消息不丢失。

      • 优化建议:应根据业务需要合理选择镜像队列的数量。镜像队列数量过多会导致同步负担加重,影响性能;但镜像队列数量过少可能导致数据丢失风险增大。

    • 建议配置

      • 配置 镜像策略(例如:为每个队列配置至少一个镜像副本)并通过 Quorum Queues 来增强数据一致性和高可用性,特别是对高可靠性要求的队列。

      • 配置 负载均衡自动故障转移 策略,确保即使某些节点宕机,系统依然能正常提供服务。

  2. 高并发与高性能

    RabbitMQ 的高并发和高性能主要体现在其消息处理能力和响应时间上。通过合理配置和优化,可以提高系统的并发处理能力,减少延迟。

    • 合理配置

      • 根据业务需求,合理配置队列大小、交换机数量和消费者数量,避免系统出现性能瓶颈。

      • 设置 合理的预取值(Prefetch Count),避免消费者在处理消息时被过多的消息阻塞。

      • 使用 批量消息处理批量确认,减少每条消息的处理时间和网络开销。

    • 性能监控

      • RabbitMQ 提供了强大的 管理插件,可以通过其实时监控系统性能,包括消息的吞吐量、队列长度、消费者数量、内存使用情况等。

      • 优化建议:定期检查 RabbitMQ 管理界面,关注队列的 长度变化消费者的空闲时间,及时发现瓶颈和性能问题。

    • 技术优化

      • 消息优先级:对于高优先级消息,可以配置优先级队列,确保高优先级消息优先处理。

      • 内存与磁盘配置:合理配置 RabbitMQ 的内存和磁盘策略,避免由于磁盘或内存不足造成的性能瓶颈。

      • 网络配置:在多节点集群中,优化节点间的网络通信,避免因网络延迟影响性能。

  3. 容灾策略 🛠️

    为了在遇到硬件故障、网络问题等情况时,RabbitMQ 能够快速恢复并继续工作,需要设计有效的容灾策略。

    • 数据备份

      • 定期备份元数据和队列数据:定期对 RabbitMQ 的元数据(如配置、权限、队列等)和消息数据进行备份,以防止因系统崩溃或其他灾难性事件丢失数据。

      • 使用 备份工具(如 rabbitmq-dump)定期备份 RabbitMQ 的配置与队列元数据。

    • 故障转移

      • 在 RabbitMQ 集群中,配置 自动故障转移备份节点,确保在主节点发生故障时,备份节点可以自动接管工作。

      • 在高可用性场景下,配合使用 Quorum Queues,确保即使某个节点发生故障,消息仍然能被有效处理。

    • 跨数据中心容灾

      • 配置 跨数据中心集群 或使用 Federation 插件来实现跨地理位置的数据同步。这样,即使某个数据中心宕机,另一个数据中心可以接管服务,避免单点故障影响整个系统。
    • 优化建议

      • 配置 持久化队列发布确认机制,确保所有消息都能够可靠持久化,即便发生故障也不会丢失。

      • 使用 死信队列(DLQ) 处理无法消费的消息,避免因异常消息积压影响系统稳定性。

🔐 七、安全问题

  1. 用户权限管理
  • 配置精细化的用户权限管理,确保只有授权用户可以访问敏感数据和操作关键功能。
  1. 访问控制列表(ACL)
  • 利用 ACL 控制不同用户对 RabbitMQ 实例中的交换机、队列等资源的访问权限,实现资源的精确控制和隔离。

🛠️ 八、生产环境的推荐配置

  1. 集群部署

    集群部署是实现高可用和负载均衡的基础,以下是一些优化建议:

    • 多节点集群:部署多个 RabbitMQ 节点以实现负载均衡和容错。当一个节点宕机时,其他节点可以继续提供服务。建议至少部署 3 个节点来实现高可用性。

    • 节点地理分布:为了提高容灾能力,可以将集群节点分布在不同的数据中心或可用区。RabbitMQ 集群默认支持节点间通过心跳和自动发现来协作,但跨数据中心时,需要考虑延迟和带宽,建议使用 RabbitMQ Federation 或 Shovel 插件来增强跨数据中心的消息同步。

    • 节点间同步:集群内节点间的同步数据量较大时,要优化网络带宽和节点间的同步机制,避免数据同步时造成系统负担。

  2. 队列镜像

    队列镜像可以在多个节点之间复制队列数据,以实现高可用性。配置队列镜像时,建议关注以下几点:

    • 镜像策略:可以根据业务的高可用性要求配置队列镜像的策略。通常,建议将关键队列配置为镜像队列,将不重要的队列放在单一节点上,以减少资源占用和同步带来的性能损失。RabbitMQ 提供 ha-policy 来配置队列的镜像规则,常见的策略有 all(所有节点镜像)、exactly(镜像指定数量的节点)、nodes(指定节点进行镜像)等。

    • 镜像同步:镜像队列会消耗额外的网络带宽,因此需要根据系统负载情况来平衡队列镜像的数量和负载,避免镜像同步带来不必要的性能开销。对于大规模消息系统,可以设置合理的队列镜像数量。

    • 读写分离:根据需要,可以设置读写分离策略,允许主节点进行写操作,而多个镜像节点用于读取,进一步提高系统性能。

  3. 合理配置交换机和队列

    合理的配置交换机、队列和消费者是提高 RabbitMQ 性能的关键:

    • 交换机配置:在生产环境中,通常会用不同类型的交换机(Direct、Fanout、Topic、Headers)来满足不同的路由需求。为确保性能,建议:

      • 少量高效的交换机:不要创建过多的交换机,避免系统复杂化和管理负担。

      • Topic Exchange:适用于复杂路由场景,可以根据业务需求配置精确的路由规则和模式,减少无效消息的路由。

    • 队列配置:队列是消息的存储容器,合理的队列配置能显著提高系统的性能。

      • 队列数量:根据并发情况合理配置队列数量。过多的队列可能会增加 RabbitMQ 的管理开销,而过少的队列会导致消息堆积,影响消费效率。

      • 消息预取(Prefetch):通过消费者的消息预取设置,避免消费者一次性拉取过多消息,造成内存压力。建议根据消费者处理能力调整 basic.qos 配置。

      • 队列长度和内存限制:设置合理的队列长度,避免队列过长导致内存占用过高。可以通过 max-lengthmax-length-bytes 限制队列长度,避免消息积压。

  4. 启用管理插件

    启用 RabbitMQ 管理插件是为了实时监控系统的健康状态,以下是优化建议:

    • 实时监控:启用 RabbitMQ 的管理插件 (rabbitmq-management) 后,可以通过 Web 界面访问管理面板,实时监控各个队列、交换机、消费者的状态,并查看详细的性能指标,如消息传输速率、队列深度、连接状态等。定期检查这些指标,及时发现系统瓶颈或异常。

    • 报警与告警机制:基于管理插件的监控功能,可以设置报警规则,如队列长度过长、消费者积压、节点负载过高等,确保及时响应潜在问题。

    • 性能分析:在高负载情况下,可以使用管理插件中的 Tracing 功能进行消息追踪,分析消息的路由和传递路径,帮助诊断系统问题。

    • 日志管理:RabbitMQ 提供了日志插件,支持记录详细的运行日志,包括系统事件、消息发布与消费情况等。配置适当的日志级别和存储策略,确保能够有效监控和分析 RabbitMQ 的运行状态。

  5. 安全性配置

    为了确保生产环境中的 RabbitMQ 安全性,以下配置至关重要:

    • 用户权限管理:通过精细化的权限控制,限制每个用户对队列和交换机的访问权限。RabbitMQ 提供的 ACL(访问控制列表)功能可以控制不同用户对不同资源的访问权限,避免不必要的资源访问。

    • SSL/TLS 加密:启用 RabbitMQ 的 SSL/TLS 加密功能,确保在生产环境中消息传输过程中的数据安全。加密传输尤其在跨数据中心部署时至关重要。

    • 访问控制:可以通过配置 IP 白名单、访问控制列表(ACL)和防火墙规则来限制对 RabbitMQ 服务的访问,减少潜在的攻击面。

  6. 灾难恢复与备份

    为了防止系统宕机导致的消息丢失,需要定期进行备份:

    • 数据备份:定期备份 RabbitMQ 的元数据、消息队列的状态以及配置文件。使用外部存储系统进行备份,确保系统数据的恢复能力。

    • 灾难恢复:为 RabbitMQ 集群配置故障转移策略,在节点宕机时,能够快速恢复服务。可以使用第三方工具或 RabbitMQ 自带的 Federation 插件实现跨数据中心的消息同步与备份。

🔄 九、与其他技术的对比

RabbitMQ 是一款成熟的消息中间件,广泛应用于异步消息处理、流量削峰、系统解耦等场景。然而,在选择消息队列时,不同的需求和应用场景需要考虑不同的技术方案。以下是 RabbitMQ 与 Kafka 和 RocketMQ 的详细对比,帮助开发者根据具体需求做出决策。

  1. RabbitMQ vs Kafka 📊
特性RabbitMQKafka
消息模型基于 AMQP 协议,支持复杂的交换机和路由机制,适合需要灵活路由和事务处理的场景。基于发布/订阅模式,适合处理大规模的日志数据流,主要面向高吞吐量的事件流处理。
性能适用于低延迟、小消息量、高可靠性的场景,吞吐量相对较低,但能保证消息不丢失。设计时优化了大数据量和高吞吐量场景,能够轻松处理每秒百万级消息。
消息传递支持持久化、消息确认和事务机制,保证消息可靠传递。主要依赖磁盘持久化,数据可靠性较高,但事务支持较弱,不适合复杂的事务处理。
扩展性支持集群和镜像队列,可以确保高可用性,但水平扩展能力较 Kafka 弱。通过分区和副本机制支持水平扩展,适用于大规模分布式集群,处理能力更强。
应用场景适用于需要复杂路由和高可靠性的场景,如订单处理、系统解耦等。适用于大数据流、实时日志分析等场景,如事件流处理、数据流管道等。
消息顺序保证队列内消息的顺序性,但跨队列消息顺序无法保证。在每个分区内保证消息的顺序性,但不同分区之间消息顺序无法保证。
延迟与吞吐量低延迟,适合需要高实时性的业务。高吞吐量,适合大规模数据流处理,延迟较高。
消费者模式支持多种消费者模型,如工作队列、发布/订阅、路由模式等。基于拉模式消费,消费者需要主动拉取消息,适合高吞吐量的场景。
持久化机制支持消息持久化、队列持久化、交换机持久化。消息持久化使用日志文件,但相较于 RabbitMQ,在消息持久性上有较大差距。

优化建议

  • 如果应用需要支持灵活的消息路由、较低的延迟,并且对事务支持有要求,RabbitMQ 是一个不错的选择。

  • 如果场景涉及大规模日志或事件流处理,尤其是需要高吞吐量的情况,Kafka 会更适合。

RabbitMQ 是一款成熟的消息中间件,广泛应用于异步消息处理、流量削峰、系统解耦等场景。然而,在选择消息队列时,不同的需求和应用场景需要考虑不同的技术方案。以下是 RabbitMQ 与 Kafka 和 RocketMQ 的详细对比,帮助开发者根据具体需求做出决策。

  1. RabbitMQ vs RocketMQ 🚀
特性RabbitMQRocketMQ
架构基于 Erlang 开发,具有高可靠性,适合处理低延迟、事务型的消息。基于分布式架构设计,支持水平扩展,特别适合大规模数据流处理。
消息模型支持 AMQP 协议,提供灵活的消息路由机制,包括 Direct、Fanout、Topic 和 Headers 类型交换机。采用自定义的消息协议,支持主题发布/订阅模型,重点支持大规模高吞吐量的消息流。
性能性能适中,吞吐量相对较低,但保证高可靠性和低延迟,适用于业务复杂的场景。优化了大吞吐量的处理能力,适用于海量数据流和事件流处理,性能表现出色。
扩展性通过集群和镜像队列实现扩展,但相较于 RocketMQ,水平扩展能力较弱。基于分布式架构,支持大规模的水平扩展,适合处理数百万消息的场景。
消息顺序保证队列内部的消息顺序,但跨队列的顺序无法保证。支持消息顺序处理,确保同一主题内的消息按顺序处理。
延迟与吞吐量低延迟,但吞吐量相对较低。吞吐量高,适用于高并发、大数据流处理,延迟较高。
事务支持支持消息确认、事务机制,确保消息的可靠传递和消费确认。支持事务消息,但事务支持不如 RabbitMQ 复杂,适合简单的事务场景。
插件机制与生态提供丰富的插件支持,如管理插件、Shovel 插件等,生态系统庞大。生态系统较为简单,但提供了基础的扩展机制,专注于高吞吐量场景。
应用场景适用于需要灵活路由、可靠消息传递和事务处理的场景,如金融、订单处理等。适用于大规模数据流、日志采集、实时事件流处理等高并发场景。

优化建议

  • 如果应用需要复杂的消息路由、事务支持以及对消息可靠性要求较高,RabbitMQ 是理想的选择。

  • 如果场景涉及大规模的日志数据流或实时事件流处理,且对吞吐量有较高要求,RocketMQ 更为合适。

RabbitMQ:灵活、可靠、支持复杂路由和事务处理,适用于中小规模的应用,尤其是需要消息可靠性和事务支持的场景。

Kafka:优化了高吞吐量和大数据流处理,适合日志分析、实时数据处理等场景,但对于复杂的事务支持较弱。

RocketMQ:专注于分布式架构和大规模数据处理,适用于高吞吐量和高并发场景,尤其在处理大规模日志、事件流时表现优异。

⚠️ 十、常见问题及注意事项

在使用 RabbitMQ 作为消息中间件时,开发者可能会遇到一些常见问题和挑战。以下是这些问题的详细分析和解决方案,以及一些注意事项,帮助确保 RabbitMQ 的高效运行和稳定性。

  1. 消息丢失 ⚠️
  • 问题描述

    • 消息丢失是使用消息队列时的一个关键问题,尤其是在高并发、系统重启或宕机时,可能会导致未消费的消息丢失。
  • 解决方案

    • 消息持久化:确保消息和队列都设置为持久化。消息持久化可以保证即使 RabbitMQ 重启,消息不会丢失。

    • 发布确认机制(Publisher Confirms):启用消息发布确认,确保生产者发送的消息已经成功写入队列。RabbitMQ 会返回确认响应,生产者可以根据该响应确认消息是否成功发送。

    • 消费者应答机制:消费者消费消息后应发送应答确认(ack),避免消息被重复消费或丢失。

  • 注意事项

    • 对于极其重要的消息,可以设置消息的 delivery_mode 为 2(持久化),确保消息写入磁盘。
  1. 性能瓶颈
  • 问题描述

    • 在高并发场景下,RabbitMQ 可能会遇到性能瓶颈,导致队列积压、延迟增加或消费速度降低。
  • 解决方案

    • 消费者调优:合理配置消费者数量,确保每个消费者能高效地消费消息。过少的消费者会导致消息积压,过多的消费者则可能增加管理开销。

    • 消息预取设置:合理设置消费者的预取值(prefetch_count),避免单个消费者处理过多消息导致其处理速度过慢。

    • 队列深度监控:监控队列深度,如果队列积压过多,及时增加消费者或者优化生产者的消息生产策略。

    • 硬件优化:确保服务器有足够的内存、CPU 和磁盘性能,尤其是当 RabbitMQ 使用磁盘存储时,磁盘的读写性能至关重要。

  • 注意事项

    • 监控 RabbitMQ 管理界面 中的系统性能指标,定期检查队列的长度、消费者的消费速率以及消息的确认延迟。
  1. 死信队列(DLQ) 🛑
  • 问题描述

    • 消息由于各种原因(如过期、无法路由、消费者拒绝等)未被消费,最终可能导致消息丢失或系统崩溃。
  • 解决方案

    • 配置死信队列:通过设置死信队列(DLQ)来捕获不能成功消费的消息,并进行后续处理。DLQ 可以帮助追踪错误消息,避免丢失。

    • 配置 x-dead-letter-exchangex-dead-letter-routing-key 来指定死信队列。

    • 死信队列消费:定期检查死信队列中的消息,分析无法消费的原因,并对这些消息进行相应的处理或报警。

  • 注意事项

    • 确保死信队列的消费者能够及时处理问题消息,防止死信队列积压。

    • 在死信队列中可以记录消息的处理失败原因,便于后续的故障排查。

  1. 安全配置 🔒
  • 问题描述

    • RabbitMQ 是一个分布式系统,默认情况下可能存在安全漏洞,尤其是对于外部暴露的服务,容易成为攻击目标。
  • 解决方案

    • 用户权限管理:合理配置 RabbitMQ 的用户权限,确保不同用户只能访问他们有权限的交换机、队列和绑定。

      • 使用 rabbitmqctl 管理用户权限。
    • 访问控制列表(ACL):使用访问控制列表(ACL)来限制不同用户对不同资源(如交换机、队列)的访问权限。

    • SSL/TLS 加密:开启 SSL/TLS 加密,保护消息传输过程中的数据安全,防止消息被窃取或篡改。

    • 防火墙与认证机制:确保 RabbitMQ 服务仅能通过安全的 IP 地址进行访问,启用认证机制,避免未授权的访问。

  • 注意事项

    • 定期审计:定期检查用户权限和访问控制,确保没有多余的权限或未授权的访问。

    • 日志监控:启用 RabbitMQ 的审计日志功能,监控用户操作和消息流动情况,及时发现潜在的安全问题。


总结

RabbitMQ 是一款功能强大的消息队列中间件,广泛应用于分布式系统中,具备高可靠性、高性能和灵活的配置能力。通过深入了解 RabbitMQ 的核心特性、架构设计和最佳实践,结合常见问题和解决方案,可以帮助开发者更好地在生产环境中使用 RabbitMQ 提升系统的可靠性和性能。

相关文章:

RabbitMQ 深度解析:从基础到高级应用的全面指南

🐰 RabbitMQ 深度解析:从基础到高级应用的全面指南 前言📘 一、RabbitMQ 简介⚙️ 二、核心特性可靠性 🔒灵活路由 🔄高可用性 🌐多协议支持 🌍多语言客户端 💻插件机制 &#x1f50…...

动手强化学习之马尔可夫决策(机器人篇)

1 马尔可夫决策过程 马尔可夫决策过程(Markov Decision Process, MDP)是一种数学框架,用于建模智能体(agent)在随机环境中做决策的问题。它假设环境的状态转换具有马尔可夫性质,即未来的状态只依赖于当前状…...

【RabbitMQ】核心概念和工作流程

文章目录 RabbitMQ 工作流程流程图 Producer 和 ConsumerConnecting 和 ChannelVirtual hostQueueExchangeRabbitMQ 工作流程 RabbitMQ 工作流程 流程图 RabbitMQ 就是一个生产者/消费者模型 Producer 就是生产者、Consumer 就是消费者Broker 是 RabbitMQ 服务器生产者和消费…...

Windows 操作系统 - Windows 10 磁盘管理无法为 C 盘选择扩展卷

Windows 10 磁盘管理无法为 C 盘选择扩展卷 在 Windows 10 的磁盘管理中,无法为 C 盘选择扩展卷(选项灰色不可用),主要原因是未分配空间没有紧邻 C 盘的右侧 补充:Windows 10 磁盘管理打开方式 1. 按下快捷键【Win …...

数据结构——双向链表

首先我们要介绍一下链表的分类 链表的分类 链表说明: 虽然有这么多种链表结构,但是我们实际中用的还是两种结构:单链表(单向不带头不循环)和 双向带头循环链表 。 单链表(单向不带头不循环)&…...

Git报错remote: Verify fatal: Authentication failed for ***

解决 Git 拉取代码时报错:fatal: Authentication failed 在使用 Git 时,执行如下命令: git pull origin master出现报错: remote: Verify fatal: Authentication failed for ***一、问题原因分析 1. 使用 HTTP 协议访问&#…...

八、自动化函数

1.元素的定位 web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。 常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector 常用的主要由cssSelector和xpath 1.1 cssSelector选择器 选择器的功能&#x…...

websoket 学习笔记

目录 基本概念 工作原理 优势 应用场景 HTTP协议与 webSoket协议之间的对比 消息推送场景 1. 轮询(Polling) 2. 长轮询(Long Polling) 3. 服务器发送事件(Server-Sent Events, SSE) 4. WebSocket…...

正版金币捕鱼海洋管家APP源码结构解析与运行环境说明

这是一款基于成熟运营逻辑开发的休闲类互动娱乐游戏《海洋管家》,采用金币流通体系,双端源码完整,结构清晰,适合用于结构学习、本地部署测试或功能参考。 整体玩法围绕捕鱼为主线,并融合了排行榜、VIP、签到、道具商城…...

大语言模型深度思考与交互增强

总则:深度智能交互的全面升级 在主流大语言模型(LLM)与用户的每一次交互中,模型需于回应或调用工具前,展开深度、自然且无过滤的思考进程。当模型判断思考有助于提升回复质量时,必须即时进行全方位的思考与…...

Vue.js 项目中 vue.config.js 常用配置项解析

Vue.js 项目中 vue.config.js 常用配置项解析 摘要 在 Vue CLI 创建的项目中,vue.config.js 是核心配置文件,用于定制化构建、开发和部署流程。本文详细解析了该文件的常用配置项,包括基础路径、开发服务器、Webpack 配置、CSS 预处理、插件…...

Javascript逗号操作符

这段代码是一个使用了生成器函数(Generator Function)的无限循环(for (;;)),内部通过switch语句控制流程。代码中有很多逗号分隔的语句,这其实是利用了JavaScript的逗号操作符(comma operator&a…...

windows系统安装驱动、cuda和cudnn

一、首先在自己的电脑里安装了nvidia的独立显卡 显卡的查找方式: CtrlShiftEsc打开任务管理器,点击性能,点击GPU 0查看显卡型号,如下图所示: 只要电脑中有nvidia的独立显卡,就可以暗转显卡驱动、cuda和cu…...

常见的 14 个 HTTP 状态码详解

文章目录 一、2xx 成功1、200 OK2、204 No Content3、206 Partial Content 二、3xx 重定向1、301 Moved Permanently2、302 Found3、303 See Other注意4、Not Modified5、307 Temporary Redirect 三、4xx 客户端错误1、400 Bad Request2、401 Unauthorized3、403 Forbidden4、4…...

DAY 44 leetcode 28--字符串.实现strStr()

题号28 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 我的解法 双指针,slow定位&…...

Nginx用途以及好处:

反向代理: 1、提高访问速度 2、进行负载均衡:所谓负载均衡,就是把大量的请求按照我们指定的的方式均衡的分配给集群中的每台服务器(不使用nginx前端会固定的访问某一台服务器 加入nginx分配到多台服务器) 3、保证后端的安全 服务器一般部署在…...

打造可控可测的星座网络:IPLOOK低轨通信仿真平台搭建实践

在低轨卫星通信迅猛发展的趋势下,空天地一体化网络正逐步成为新一代信息基础设施的核心组成。作为移动核心网领域的技术引领者,IPLOOK依托在5G核心网、NTN(非地面网络)和卫星通信仿真方面的技术优势,率先构建了自主可控…...

火车头采集动态加载Ajax数据(无分页瀑布流网站)

为了先填充好数据在上线,在本地搭建了一个网站,并用火车头采集数据填充到里面。 开始很上手,因为找的网站的分类中是有分页的。很快捷的找到页面标识。 但是问题来了,如今很多网站都是采用的Ajax加载数据,根本没有分…...

笔记:代码随想录算法训练营day67:Floyd 算法精讲、A * 算法精讲 (A star算法) 严重超时完结,不过,撒花

学习资料:代码随想录 Floyd 算法精讲 卡码网:97. 小明逛公园 首先明确floyd算法解决的是多源最短路径问题,对边的权的正负值没有要求,而且是动态规划的思想 五部曲: 定义:grid[i][j][k]表示从i出发到j…...

Electron Forge【实战】桌面应用 —— AI聊天(中)

系列教程 Electron Forge【实战】桌面应用 —— AI聊天(上) 添加本地存储 Dexie.js 用 IndexedDB 实现,Dexie.js 库简化操作 npm i dexie新建文件 src\db.ts import Dexie, { type EntityTable } from "dexie";import { Provide…...

国达陶瓷重磅推出陶瓷罗马柱外墙整装尖端新产品“冠岩臻石”

近日,记者在佛山国达建材有限公司(以下简称国达陶瓷)董事长杨建平处了解到,该公司重磅推出的“冠岩臻石”新产品,是属于陶瓷罗马柱外墙整装产品中的尖端产品。新产品自面市之后,深受高端用户的青睐与认可。…...

Java 系统设计:如何应对高并发场景?

Java 系统设计:如何应对高并发场景? 在现代互联网应用中,高并发场景已经成为系统设计中不可避免的挑战。无论是电商秒杀、抢票系统,还是实时数据处理平台,高并发场景都对系统的性能、稳定性和扩展性提出了极高的要求。…...

VR 全景多维赋能,众趣科技助力零售业开启购物新时代

说到商铺这个词,最早形成于春秋战国时期,当时还未形成固定位置的商铺,部分有远见的商人会在人流量较大的区域摆设摊位,促进了城市的繁荣‌。‌到了唐宋时期,商铺进一步发展‌,并随着商品经济的发展和城市人…...

五大生产模式(MTS、MTO、ATO、ETO、CTO)的差异

五大生产模式(MTS、MTO、ATO、ETO、CTO)差异 一、 库存控制二、 订货提前期三、交期与库存分析四、五大生产模式的产品生命周期 一、 库存控制 ETO 模式侧重于原材料库存管理,以应对定制设计所需的物料供应。 MTO 模式重点是原材料库存&…...

clickhosue中json字符串转为表

将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 -- 将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 WITH -- 解析 JSON 数据为字符串json_data AS (SELECT [{"c…...

二叉树的基本功能实现

一.二叉树的结构及实现 1.二叉树的结构 在之前的章节中已经介绍过,二叉树是一种特殊的树,其最大度为2,及最多有左,右两个孩子,结构图如下 在此之前已经讨论过一些特殊的二叉树,这里讨论一般的二叉树 2.…...

VSCode 降低适用版本并且关闭自动更新

VSCode 降低适用版本并且关闭自动更新 相关链接问题描述解决方法下载安装包关闭自动更新 参考链接 相关链接 VSCode 官网 问题描述 无法正常使用vscode-remote插件远程连接Centos7等一些老版本Linux云服务器(如Centos7) 从2024年1月,vsco…...

OpenHarmony - 小型系统内核(LiteOS-A)(二)

OpenHarmony - 小型系统内核(LiteOS-A)(二) 三、基础内核 3.1、中断及异常处理 基本概念 中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,出现了一个必须…...

2025第十六届蓝桥杯PythonA组部分题解

试题A:数字求和 题目描述 给定两个整数a和b,输出它们的和。 输入格式:两个整数,空格分隔 输出格式:一个整数 输入输出样例 输入: 5 8输出: 13解题思路 直接使用加法运算符计算两数之和。…...

苍穹外卖day04

Spring Task实现定时处理订单状态 作用:不需要输入提示信号,便可定时自动执行程序 使用步骤 1、启动类上加上注解(EnableScheduling)开启定时任务调度 2、专门创建一个包来管理执行定时任务的类,该类需要交给IOC容…...

曲线与曲面的绘制

一、学习目标 (1)掌握常用规则参数曲线与曲面的编程绘制方法。 (2)掌握自由曲线与曲面的编程绘制方法。 (3)了解自由曲面的拼接编程方法。 二、学习内容 (1)编程绘一个规则参数…...

Python Cookbook-6.2 定义常量

任务 你需要定义一些模块级别的变量(比如命名的常量),而且客户代码无法将其重新绑定。 解决方案 你可以把任何对象当做模块一样安装。将下列代码存为一个模块const.py,并放入你的Python的sys.path 指定的目录中: class _const(object):class ConstEr…...

【信息系统项目管理师】高分论文:论信息系统项目的范围管理(信息化系统综合管理平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划范围管理2、收集需求3、定义范围4、创建WBS5、确认范围6、控制范围论文 2017年6月,我作为项目经理参与了 XX市经济和信息化委员会系统综合管理平台建设项目,该项目投资共150万元人民币,建设工期…...

用Webpack 基础配置快速搭建项目开发环境

Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具,但是Webpack有大量的配置项,对新手不太友好,但是我们可以根据webpack-cli的init命令根据项目需求快速生成webpack的配置文件,本文将手把手教你如何用 Webpack 和 npm 快…...

【LLM Agent】SystemMessage 和 HumanMessage

文章目录 SystemMessage 和 HumanMessageSystemMessage(系统消息)HumanMessage(用户消息)结合使用高级设置能否将用户消息(HumanMessage)写在系统消息(SystemMessage) SystemMessage…...

机器学习核心知识:从基础概念到关键算法

摘要 本文深度剖析机器学习知识体系,从基本概念、学习方式,到分类算法、逻辑回归等关键内容均有涉及。详细阐述各知识点原理与应用场景,并对比多种算法的优劣。 关键词:机器学习;监督学习;分类算法&#x…...

信奥赛之c++基础(for与if的嵌套使用)

🍭 糖果工厂大闯关——for与if的嵌套魔法 🚚 第一章:快递站的故事(情景引入) 📦 快递分拣员小明 快递站每天要处理100个包裹,小明发现: 有些包裹要立即派送(红色标签)有些包裹可以暂存仓库(蓝色标签)for (int 包裹号=1; 包裹号<=100; 包裹号++) {if (包裹颜…...

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日&#xff0c;备受瞩目的QCon开发者技术峰会盛大举行&#xff0c;本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题&#xff0c;汇聚了众多鸿蒙生态的领军人物与技术专家&#xff0c;共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…...

day25 学习笔记

文章目录 前言一、图像翻转二、图像的仿射变换1.仿射变换的原理2.仿射变换函数3.图像旋转4.图像平移5.图像缩放6.图像剪切 三、插值方法1.最近领插值2.双线性插值法3.双三次插值4.代码展示 前言 通过今天的学习&#xff0c;我掌握了OpenCV中有关图像翻转&#xff0c;图像仿射变…...

Docker构建go-web应用

https://www.liwenzhou.com/posts/Go/deploy-in-docker/#c-0-4-0 本文介绍了如何使用Docker以及Docker Compose部署我们的 Go Web 程序。 Docker部署示例 准备代码 这里我先用一段使用net/http库编写的简单代码为例讲解如何使用Docker进行部署&#xff0c;后面再讲解稍微复杂…...

人工智能100问☞第4问:人工智能与机器学习、深度学习的区别?

目录 一、通俗解释 二、专业解析 三、权威参考 人工智能(AI)是目标​​:让机器具备智能(如建造一辆车);机器学习(ML)是引擎​​:提供动力方法(如燃油发动机);深度学习(DL)是涡轮增压​​:提升引擎性能(如处理复杂路况)。三者协同驱动技术发展,如同车辆需要…...

电子电器架构 --- 智能座舱的定义

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

JavaScript Map 对象深度解剖

JavaScript Map 对象深度解剖 一、Map 核心特性 1.1 什么是 Map&#xff1f; 通俗解释&#xff1a; Map 就像是一个“超级版对象”&#xff0c;它用更灵活的方式存储键值对。举个生活例子&#xff1a; 普通对象&#xff08;Object&#xff09;像一本传统电话簿&#xff0c;…...

zlm启用webrtc交叉编译指南

zlm启用webrtc交叉编译指南 一、交叉编译openssl 下载openssl-1.1.1k版本&#xff0c;其他版本可能会有问题 $ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz $ tar -xvzf openssl-1.1.1k.tar.gz $ cd openssl-1.1.1k $ ./config no-asm shared --openssld…...

树莓派超全系列教程文档--(23)内核参数

内核参数 内核命令行 (cmdline.txt)命令行选项标准条目设置KMS显示模式 其他条目 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 内核命令行 (cmdline.txt) Linux 内核在启动过程中接受一系列命令行参数。在 Raspberry Pi 上&#xff0c;该命令…...

机器学习 从入门到精通 day_05

1. 线性回归 前面介绍了很多分类算法&#xff0c;分类的目标变量是标称型数据&#xff0c;回归是对连续型的数据做出预测。 标称型数据&#xff08;Nominal Data&#xff09;是统计学和数据分析中的一种数据类型&#xff0c;它用于分类或标记不同的类别或组别,数据点之间并没有…...

读者、写者问题优化

#include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define NUM_READERS 5 #define NUM_WRITERS 5 // 定义信号量和全局变量 sem_t sdata, srcount; int rea…...

DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析

DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析 DeepSeek作为中国人工智能领域的重要参与者&#xff0c;推出了V3和R1两款大模型&#xff0c;它们在架构设计和应用场景上各有侧重。本文将深入分析这两款模型在架构原理上的核心差异&#xff0c;并探讨它们如何分别应对复杂推…...

OpenCV图像增强实战教程:从理论到代码实现

OpenCV图像增强实战教程&#xff1a;从理论到代码实现 &#x1f525;&#x1f680; &#x1f4da; 想要掌握图像增强的核心技术&#xff1f;本文手把手教你使用OpenCV实现多种图像增强技术&#xff0c;从基础的线性变换到高级的频域滤波&#xff0c;全方位提升你的图像处理能力…...

一文介绍关于多模态的基础知识 !!

文章目录 前言 一、机器学习 二、深度学习 三、应用领域 前言 多模态不再局限于单一类型的数据处理&#xff0c;它融合图像、文本和音频等多种信息源。其基础知识涵盖机器学习、深度学习及其在多模态领域的应用。机器学习部分包含分类、回归、聚类和降维等四类算法&#xff1b…...