JMS和消息中间件:Kafka/RocketMQ
TPM 项目中, iflow之间使用了JMS,后端项目与数据库通信使用Kafka
MQ和JMS的区别:
JMS是 java 用来处理消息的一个API规范。市面上绝大数 MOM(Message-Oriented Middleware 消息中间件)都支持.
MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
目前主流的 MQ 主要是 RocketMQ、kafka、RabbitMQ,ActiveMQ
消息传递模型
○ JMS
■ 支持两种主要的消息传递模型:
■ 点对点(P2P)模型:消息生产者将消息发送到一个特定的队列,每个消息只有一个消费者能够接收和处理。这种模型适用于任务分配的场景,例如在一个任务调度系统中,任务生产者将任务消息发送到队列,一个任务执行器作为消费者从队列中获取任务并执行。
■ 发布 / 订阅(Pub/Sub)模型:消息生产者将消息发布到一个主题,多个消息消费者可以订阅这个主题来接收消息。这类似于广播系统,例如在一个新闻发布系统中,新闻生产者将新闻消息发布到主题,多个订阅用户(如新闻客户端)可以接收新闻消息。
○ Kafka
■ 主要基于发布 / 订阅模型,但它也具有一些独特的特点。在 Kafka 中,消息被存储在主题(Topic)下的分区中,消费者可以订阅主题来获取消息。而且消费者可以通过消费者组(Consumer Group)的方式进行组织。同一个消费者组中的消费者共同分担对消息的消费,不同消费者组之间相互独立,都可以完整地消费主题中的消息。例如,在一个数据收集和分析系统中,多个数据收集客户端作为生产者将数据发送到 Kafka 主题,不同的数据分析团队可以组成不同的消费者组从主题中获取数据进行分析。
使用JMS还是Kafka
- 应用场景和需求特点
○ 简单的异步消息传递场景(选择 JMS)
■ 如果你的应用场景主要是在 Java 应用程序之间进行简单的异步通信,并且不需要处理大规模的数据流,JMS 可能是一个合适的选择。例如,在一个小型企业内部的员工任务管理系统中,任务分配模块作为消息生产者将任务消息发送到消息队列(基于 JMS),员工对应的任务处理客户端作为消息消费者从队列中获取任务消息。这种场景下,消息量相对较小,主要关注的是消息的可靠传递和异步处理。
○ 大规模实时数据处理场景(选择 Kafka)
■ 当需要处理海量的实时数据,如互联网公司的用户行为数据收集、日志处理等场景,Kafka 是更好的选择。以一个大型电商网站为例,每秒可能有成千上万的用户浏览商品、下单等行为,这些行为数据可以作为实时数据流发送到 Kafka 集群。Kafka 能够高效地接收、存储这些数据,并为后续的数据分析、推荐系统等提供数据支持,其分布式架构和高吞吐量的特点可以很好地应对这种大规模的数据处理需求。 - 消息传递模型偏好
○ 点对点模型主导的场景(倾向 JMS)
■ 如果你的应用场景主要依赖点对点的消息传递模型,JMS 的实现可能更符合你的需求。例如,在一个订单处理系统中,订单生成模块将订单消息发送到特定的队列,库存管理模块作为唯一的消费者从队列中获取订单消息来更新库存。这种一对一的消息传递方式在 JMS 中通过队列实现得较为简单直接,而且 JMS 对这种模型的支持历史悠久,相关的事务处理等机制也比较成熟。
○ 发布 / 订阅和消费者组应用场景(倾向 Kafka)
■ 对于需要灵活运用发布 / 订阅模型并且涉及消费者组的场景,Kafka 具有明显的优势。例如,在一个新闻媒体公司的内容分发系统中,新闻编辑部门作为生产者将新闻消息发布到 Kafka 主题,不同的终端设备(如手机应用、网页浏览器等)可以根据用户的订阅情况组成不同的消费者组从主题中获取新闻消息进行展示。消费者组的设置可以方便地对消息消费进行负载均衡和灵活分配,这是 Kafka 在这种复杂的发布 / 订阅场景中的一个重要优势。 - 可靠性和数据持久化要求
○ 高可靠性但传统事务处理需求(JMS 可能更合适)
■ 如果你的应用对消息传递的可靠性要求很高,并且需要传统的事务处理机制,如在金融领域的交易指令传递等场景,一些 JMS 实现可能更能满足需求。JMS 消息中间件通常提供了成熟的消息确认机制,如自动确认、客户端确认等,并且可以通过与数据库等存储系统结合来实现消息的持久化存储,以确保消息在传递过程中不会丢失,同时保证事务的完整性。
○ 高可靠性和大规模数据持久化(Kafka 优势明显)
■ 当需要对海量数据进行持久化存储并且保证高可靠性时,Kafka 的优势就体现出来了。例如,在一个云存储服务公司的数据备份系统中,大量的用户文件数据需要进行持久化存储并且要保证数据的安全性和可用性。Kafka 的多副本机制可以确保数据在多个代理(Broker)之间进行备份,并且通过将消息持久化存储在磁盘分区上,能够有效防止数据丢失,同时还能提供高效的数据访问。 - 性能和延迟要求
○ 对低延迟要求不高,中等性能场景(JMS 可以胜任)
■ 如果你的应用对消息传递的延迟要求不是特别严格,并且性能需求处于中等水平,JMS 可能能够满足要求。例如,在一个企业内部的邮件通知系统中,新邮件到达的通知消息通过 JMS 发送到用户的客户端,这里对消息传递的延迟可以容忍几秒甚至更长时间,JMS 在这种场景下可以通过合适的消息中间件实现可靠的消息传递。
○ 低延迟、高吞吐量性能需求(Kafka 是优选)
■ 对于那些需要在高并发情况下实现低延迟和高吞吐量的应用,如实时竞价系统、物联网数据采集等场景,Kafka 是更好的选择。在物联网场景中,大量的传感器设备需要实时将数据发送到服务器进行处理,Kafka 通过异步发送消息、零拷贝技术等手段能够快速接收和处理这些数据,满足低延迟和高吞吐量的要求。
Kafka与RocketMQ的优缺点
1. Kafka
优点:
高吞吐量:Kafka能够处理每秒数百万条消息,适合大规模数据流处理。
水平扩展性:通过分区机制,Kafka可以轻松扩展,支持大规模分布式部署。
持久化存储:Kafka将消息持久化到磁盘,确保数据的可靠性和持久性。
高可用性:通过复制机制,Kafka能够在节点故障时继续提供服务。
低延迟:Kafka设计为低延迟系统,适合实时数据处理。
缺点:
复杂性:Kafka的部署和管理相对复杂,需要专业知识和经验。
资源占用:Kafka对硬件资源要求较高,特别是磁盘和网络带宽。
延迟一致性:Kafka采用最终一致性模型,可能导致短暂的不一致。
2. RocketMQ
优点:
高可靠性:RocketMQ支持分布式事务和多副本机制,确保消息的高可靠性。
高性能:RocketMQ在处理高并发、高吞吐量场景下表现出色。
顺序消息:RocketMQ支持严格的顺序消息,适用于需要顺序处理的业务场景。
灵活的消费模式:支持多种消费模式,包括广播消费和集群消费。
易于集成:RocketMQ提供丰富的客户端库,易于与现有系统集成。
缺点:
社区活跃度:相比Kafka,RocketMQ的社区活跃度和生态系统较弱。
运维复杂度:RocketMQ的运维和调优需要一定的经验和技巧。
文档和支持:文档和社区支持相对较少,可能需要更多的自主探索。
Kafka与RocketMQ的使用场景
Kafka使用场景:
实时数据处理:需要处理高吞吐量、低延迟的数据流,如实时日志分析、实时监控和实时推荐系统。
大数据管道:构建数据管道,将数据从不同来源高效传输到数据湖或数据仓库。
事件驱动架构:实现事件驱动的微服务架构,支持事件的发布和订阅。
日志聚合:集中收集和处理分布式系统的日志数据,进行统一分析和监控。
RocketMQ使用场景:
金融交易系统:需要高可靠性和顺序消息处理的金融交易系统。
电商平台:处理高并发订单和支付消息,确保消息的可靠传递和顺序处理。
分布式事务:支持分布式事务的业务场景,如跨服务的事务管理。
消息通知系统:实现高可靠性的消息通知和广播,如短信、邮件通知系统。
Kafka与RocketMQ的选型指南
1. 数据量与吞吐量:
高数据量、高吞吐量:选择Kafka,适合处理大规模数据流和高并发场景。
中等数据量、高可靠性:选择RocketMQ,适合需要高可靠性和顺序处理的场景。
2. 实时性与延迟:
高实时性、低延迟:选择Kafka,适合实时数据处理和低延迟应用。
严格顺序、事务支持:选择RocketMQ,适合需要严格顺序和分布式事务的应用。
3. 系统复杂性与管理:
高复杂性、专业管理:选择Kafka,需要专业团队进行部署和维护。
中等复杂性、灵活集成:选择RocketMQ,适合需要灵活集成和高可靠性的场景。
4. 持久化与可靠性:
高持久性、可靠性要求:选择Kafka,确保数据的持久化和高可用性。
高可靠性、顺序处理:选择RocketMQ,确保消息的高可靠性和顺序处理。
原文地址:https://blog.csdn.net/qq_42765398/article/details/144216983
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!