消息中间件---初识(Kafka、RocketMQ、RabbitMQ、ActiveMQ、Redis)

news2024/11/21 2:27:48

1. 简介

        消息中间件是一种支撑性软件系统,它在网络环境中为应用系统提供同步或异步、可靠的消息传输。消息中间件利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它支持多种通信协议和数据格式,可以在不同的应用系统之间进行透明的消息传递。

        消息中间件的主要特点包括异步通信、持久化、削峰填谷、系统解耦、集群扩展、负载均衡等。它适用于需要可靠数据传送的分布式环境,如金融行业,可以用于处理高并发交易、降低系统耦合度并提高系统的可用性和可扩展性。

        在实际应用场景中,消息中间件可以用于异步处理、应用解耦、流量削峰、日志处理和数据流处理等。例如,在用户注册后发送邮件和短信的场景中,可以通过消息队列异步处理这些任务,从而加快响应速度并提高系统性能。在流量削峰方面,消息中间件可以将大量用户请求缓存起来,系统可以根据自身的最大处理能力从消息队列中间件中主动消费数据进行处理,从而提高系统的稳定性。

        常见的消息中间件产品包括 RabbitMQ、Kafka、ActiveMQ 、RocketMQ等。在选择消息中间件时,需要考虑性能、可靠性、易用性和开放性等因素。例如,Kafka 适合需要高吞吐量和稳定性的大数据处理场景,而 RabbitMQ 适用于业务平稳、不需要频繁改源码的场景。

        消息中间件的架构通常包括消息通道、消息总线、发布/订阅模型等。它可以通过通道将客户端和服务端连接起来,使他们可以交换消息,或者通过消息总线将不同的服务连接起来,允许它们异步传递数据。

2. 比较

以下是使用表格形式对几种常见消息中间件的比较:

特性/中间件KafkaRabbitMQRocketMQRedisActiveMQ
消息模型发布/订阅、点对点点对点、发布/订阅发布/订阅、点对点发布/订阅点对点、发布/订阅
适用场景日志收集、流处理、大数据处理企业级消息传递、实时系统大规模分布式系统、高吞吐量消息传递轻量级消息传递、缓存企业级应用、需要JMS支持的场景
吞吐量低(小数据量)
延迟较高较低较低较低
可用性高(分布式架构)高(镜像队列)高(主从架构)取决于配置高(集群部署)
可靠性高(多副本、ISR机制)高(持久化、消息确认)高(刷盘、主从复制)取决于配置高(持久化、集群)
持久化支持支持支持支持支持
消息回溯支持支持支持不支持支持
消息堆积支持支持支持支持(有限)支持
协议支持自定义AMQP、STOMP等自定义自定义JMS、OpenWire等
开发语言Scala/JavaErlangJavaC/C++/Python/PHP等Java
社区活跃度非常高
运维管理有专用工具如Confluent有管理界面和插件CLI工具简单有管理界面

这个表格只是一个简单的比较,实际情况可能会因为不同版本和配置的不同而有所变化。每种消息中间件都有其特定的优势和劣势,选择时应根据具体的业务需求和技术栈进行综合考虑。

3. 模型架构

3.1 Kafka

  • Producer:消息的发送者,负责产生消息并发送到Kafka集群。

  • Topic:消息的分类,Kafka中的消息以Topic为单位进行分类。

  • Broker:Kafka中的服务器节点,负责处理生产者发送的消息,并存储到磁盘中。

  • Partition:Topic中的一个子分区,用于实现消息的横向扩展。

  • Consumer:消息的消费者,订阅Topic并消费消息。

  • Zookeeper:Kafka集群的协调服务,负责管理Broker和Consumer的元数据信息,以及集群的协调工作。

原理:Kafka的设计理念是高吞吐量和可扩展性。通过将Topic划分为多个Partition,分布在不同的Broker上,可以实现负载均衡和水平扩展。Zookeeper用于集群的元数据管理和协调,确保系统的高可用性。

3.2 RabbitMQ

  • Producer:消息的发送者。

  • Exchange:消息交换机,根据路由规则将消息路由到不同的Queue。

  • Queue:消息的存储队列,消费者从队列中获取消息。

  • Consumer:消息的消费者。

  • Federation:用于跨RabbitMQ集群的消息传递。

原理:RabbitMQ通过Exchange和Queue的组合提供了灵活的路由功能。Exchange支持多种类型的路由规则,可以根据需要将消息路由到一个或多个Queue中。Federation允许跨集群的消息传递,增强了系统的扩展性。

3.3 RocketMQ

 

  • Producer Group:消息生产者组,负责发送消息。

  • Broker:存储消息的服务节点。

  • Consumer Group:消息消费者组,负责消费消息。

  • NameServer:负责集群元数据的管理和路由信息的提供。

原理:RocketMQ的设计目标是高吞吐量和大规模集群的管理。通过NameServer集群来管理Broker的元数据信息,实现了Broker的动态注册和发现。Producer Group和Consumer Group的设计使得消息的发送和消费可以并行处理,提高了系统的吞吐量。

3.4 ActiveMQ

  • Producer:消息的发送者。

  • Broker:ActiveMQ中的服务器节点,负责处理消息。

  • Storage:消息的持久化存储。

  • Consumer:消息的消费者。

原理:ActiveMQ提供了持久化消息的功能,确保消息不会因为系统故障而丢失。Broker负责消息的路由和分发。通过集群部署,ActiveMQ可以实现高可用性和负载均衡。

 

3.5 Redis

  • Producer:消息的发送者。

  • Redis:作为消息中间件的Redis服务器,负责存储和传递消息。

  • Consumer:消息的消费者。

原理:Redis通过发布/订阅模式实现消息传递。Producer将消息发布到一个频道,Consumer订阅这个频道来接收消息。Redis的发布/订阅模式是无状态的,适合于简单的消息传递场景。

4. 适用场景

4.1 Kafka

适用场景

  • 日志收集:Kafka 常用于收集分布式系统中的日志信息。

  • 流处理:适用于实时流处理场景,如用户行为分析、实时监控等。

  • 事件源:在微服务架构中,Kafka 可以作为事件源,实现服务间的通信。

  • 大数据处理:与 Hadoop、Spark 等大数据处理框架集成,进行大批量数据的实时处理。

最佳实践

  • 消息模型:使用 Partition 提高吞吐量,合理设置 Partition 数量以平衡负载。

  • 数据不均衡处理:避免数据倾斜,确保消息均匀分布到各个 Partition。

  • 监控:配置消息堆积数监控,以便在消息堆积时及时收到通知并处理。

  • 安全性:使用 SSL/TLS 加密数据传输,确保数据安全。

  • 资源控制:合理配置消费者线程数量和批量处理大小,以优化性能 。

 4.2 RabbitMQ

适用场景

  • 任务队列:适用于异步任务处理,如邮件发送、图片处理等。

  • 事件通知:实现事件驱动架构,进行事件的发布和订阅。

  • 应用解耦:通过消息队列实现服务间的松耦合。

  • 多服务通信:在分布式系统中,RabbitMQ 可以作为不同服务之间的通信桥梁。

最佳实践

  • 消息持久化:确保重要消息不丢失,通过设置消息和队列的持久性。

  • 避免资源泄露:合理配置资源,避免长时间运行的事务。

  • 监控和调优:定期监控 RabbitMQ 的性能指标,并根据需要进行调优。

  • 使用合适的消息协议:根据业务需求选择合适的消息协议,如 AMQP、MQTT、STOMP 等。

  • 合理使用交换机:利用不同类型的交换机(direct、topic、fanout、headers)来路由消息 。

4.3 RocketMQ

适用场景

  • 大规模分布式系统:适用于需要高吞吐量和大规模消息传递的场景。

  • 顺序消息:支持顺序消息的发送和消费,适用于需要保证消息顺序的业务场景。

  • 定时消息:支持定时消息的发送,适用于需要定时任务处理的场景。

最佳实践

  • 消息发送:使用 Tag 和 Key 来标识消息子类型和唯一标识,方便消息过滤和问题定位。

  • 消息可靠性:对于关键业务,实现消息发送失败后的重试机制,确保消息可靠传输。

  • 消费幂等性:确保消费过程的幂等性,避免重复消费导致的问题。

  • 消费速度:通过增加消费并行度和批量消费来提高消费速度。

  • 消息堆积处理:在消息堆积时,可以选择重置位点跳过非重要消息 。

4.4 ActiveMQ

适用场景

  • JMS实现:作为 JMS 规范的实现,适用于需要 JMS 支持的场景。

  • 企业级应用:适用于需要高可靠性和集群支持的企业级应用。

最佳实践

  • 消息持久化:确保重要消息不丢失,通过设置消息持久化。

  • 集群部署:通过集群部署提高 ActiveMQ 的可用性和可靠性。

  • 监控:监控 ActiveMQ 的性能指标,及时发现和解决问题。

  • 安全性:配置适当的安全措施和权限控制策略,确保 ActiveMQ 的安全性 。

 4.5 Redis

适用场景

  • 缓存:作为内存缓存,提高数据访问速度。

  • 消息队列:使用 Redis 的发布/订阅功能实现简单的消息队列。

  • 计数器:实现高并发下的原子操作,如计数器、限流等。

最佳实践

  • 内存优化:控制 key 的长度,避免存储 bigkey,选择合适的数据类型。

  • 性能优化:避免复杂度高的命令,使用长连接操作 Redis。

  • 可靠性:设置合理的 maxmemory 和淘汰策略,避免集中过期 key。

  • 安全性:不要将 Redis 部署在公网可访问的服务器上,使用密码认证,禁用危险命令。

  • 监控:监控 Redis 的性能和资源使用情况,及时发现和解决问题 。

注:后续会更新每种消息中间件单独实践文章

 

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

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

相关文章

CompletableFuture常用方法

一、获得结果和触发计算 1.获取结果 &#xff08;1&#xff09;public T get() public class CompletableFutureAPIDemo{public static void main(String[] args) throws ExecutionException, InterruptedException{CompletableFuture<String> completableFuture Com…

OpenAI 推理模型 O1 研发历程:团队访谈背后的故事

在 2024 年&#xff0c;OpenAI 推出了具有突破性推理能力的 O1 模型&#xff0c;自发布以来&#xff0c;这款新型 AI 模型引发了技术界的广泛关注。与 GPT-4 等大语言模型不同&#xff0c;O1 不仅具备处理复杂问题的能力&#xff0c;还能模拟人类思考过程&#xff0c;从而提高推…

告别 backtrader!换这个库实施量化回测

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 在算法交易的领域,拥有一个强大的回测和策略分析工具至关重要。Vectorbt 已成为最有效且多功能的 Python 库之一。这款开源工具允许交易者在历史数据上测试策略、优化参数,并进行详尽的投资组合和风…

差分(续前缀和)(含一维二维)

题目引入 开发商小 Q 买下了一条街&#xff0c;他想在这条街的一边盖房子。 街道可以抽象为一条数轴&#xff0c;而小 Q 只会在坐标在 1~n 的范围内盖房子。 首先&#xff0c;小 Q 将街上坐标在 1∼ &#x1d45b;1∼ n 范围内的物体全部铲平。也就是说&#xff0c;在正式动工盖…

Kubernetes环境搭建

华子目录 Kubernetes部署说明环境准备工作主机准备harbor搭建k8s集群中的主机名和ip设定k8s集群中设置hosts解析k8s中的所有节点关闭防火墙和selinuxk8s集群中禁用swap分区k8s集群中安装docker-cek8s集群中下载harbor证书k8s集群中配置harbor镜像加速器 k8s节点登录harbor测试 …

当人工智能拥抱餐饮业,传统与创新的交融

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 今天我们要聊一个充满烟火气的行业&#x…

C++进阶知识 AVL树实现

AVL树 1. AVL的概念2. AVL树的实现2.1 AVL树的结构2.2 AVL树的插⼊2.2.1 AVL树插⼊⼀个值的⼤概过程2.2.2 平衡因⼦更新 2.3 旋转2.3.1 旋转的原则2.3.2 右单旋2.3.4 左单旋2.3.5 左右双旋 3.代码实现 1. AVL的概念 • AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗…

Linux Debian12使用Podman安装bwapp靶场环境

一、bwapp简介 bWAPP&#xff08;buggy Web Application&#xff09;是一个开源的、故意设计有漏洞的Web应用程序&#xff0c;旨在帮助安全爱好者、开发人员和学生发现和防止Web漏洞。它包含了超过100种不同的漏洞&#xff0c;涵盖了所有主要的已知Web漏洞。 二、bwapp下载 …

C++系列-多态

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 多态 多态就是不同类型的对象&#xff0c;去做同一个行为&#xff0c;但是产生的结果是不同的。 比如说&#xff1a; 都是动物叫声&#xff0c;猫是喵喵&#xff0c;狗是汪汪&am…

安装图片标识工具anylabeling

目录 下载压缩包 创建环境 安装opencv 安装第三方库 运行setup.py文件 安装过程可能会出现的错误&#xff1a; 错误1 错误2 安装完成 图标更换 之前提到的嵌入式开发】可编程4k蓝牙摄像头点击器还可以训练模型&#xff0c;使图像识别精度提高 现在讲解&#xff0c;如…

wsl(4) -- 编译驱动模块

1. 内核源码 编译模块需要内核源码信息&#xff0c;wsl是修改过的内核无法使用下面的命令从标准镜像源上下载内核源码信息。 sudo apt-get install kernel-headers-$(uname -r) sudo apt-get install kernel-devel-$(uname -r)2. 下载wsl内核源码 可以考虑下载wsl的源码重新…

【分页】Spring Boot 列表分页 + javaScript前台展示

后端&#xff1a; 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、模运算、模运算性质、栈

PDF文档回复:20241002 **1 P1981 [NOIP2013普及组] 表达式求值 ** [题目描述] 给定一个只包含加法和乘法的算术表达式&#xff0c;请你编程计算表达式的值 [输入格式] 一行&#xff0c;为需要你计算的表达式&#xff0c;表达式中只包含数字、加法运算符 “” 和乘法运算符 …

C/C++语言基础--C++IO流、输入输出流、文件流、字符串流、重定向流等详解

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 流思想&#xff0c;我认为在计算机中是一个很重要的思想&#xff0c;因为计算机、编程无非就是获取数据&#xff0c;然后对数据进行操作&#xff1b;C给主要给我们提供了3种流&#xff0c;输入输出流、文件流…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

# VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统?

VirtualBox中安装的CentOS 6.5网络设置为NAT模式时&#xff0c;怎么使用SecureCRT连接CentOS6.5系统&#xff1f; 一、查询 【VirtualBox Host-Only Network】虚拟网卡的网络配置 IP。 1、按键盘上WIN R 组合键&#xff0c;打开【运行】&#xff0c;输入【 ncpa.cpl 】&…

C0012.Clion改用VS编译器开发Qt界面

1.VS编译器添加 2.配置MSVC2019环境变量 3.各种问题报错与解决 问题描述 warning C4819&#xff1a;该文件包含不能在当前代码页(936)中表示的字符。解决办法 在CMakeLists.txt中添加如下代码 # 如下代码只在使用VS编译器时需要&#xff0c;使用mingw32编译器时需要注释掉 #…

利用Numpy实现全连接神经网络实验分析

一、实验要求 用 python 的 numpy 模块实现全连接神经网络。网络结构为一个输入层、一个隐藏层、一个输出层。隐藏层的激活函数为 Relu 函数&#xff0c;输出层的激活函数为 softmax 函数&#xff0c;损失函数为交叉熵。 二、实验目的 学会构建一个简单的全连接神经网络模型学…

鸿蒙网络管理模块01——HTTP与WebSocket请求数据

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 鸿蒙的网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1…

影刀RPA实战:网页爬虫之电影数据

1.实战目标 电影自媒体是指个人或团队通过互联网平台&#xff0c;如微博、微信公众号、抖音、B站等&#xff0c;发布与电影相关的内容&#xff0c;包括但不限于电影评论、推荐、幕后制作揭秘、明星访谈等。这些内容旨在吸引电影爱好者&#xff0c;并与之互动&#xff0c;构建起…