莒县网站设计,合肥做网站推广的公司,区域城市分站网站怎么做,买空间去哪个网站文章目录 1.消息队列基础知识1.1什么是消息队列#xff1f;1.2消息队列有什么用#xff1f;#xff08;结合项目说#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型#xff08;11.2消息队列有什么用结合项目说1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型1点对点P2P模型2发布/订阅Pub/Sub模型 1.5消息队列技术选型1.5.1 Kafka1特点 1.5.2 RocketMQ1特点 1.5.3 RabbitMQ1特点 1.5.4技术选型 1.消息队列基础知识
1.1什么是消息队列
我们可以把消息队列看作是一个存放消息的容器当我们需要使用消息的时候直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构所以消费消息时也是按照顺序来消费的。 参与消息传递的双方称为 生产者 和 消费者 生产者负责发送消息消费者负责处理消息。 1.2消息队列有什么用结合项目说
通过异步处理提高系统性能减少响应所需时间削峰/限流降低系统耦合性。
1.2.1异步处理 将用户的请求数据存储到消息队列之后就立即返回结果。随后系统再对消息进行消费。
因为用户请求数据写入消息队列之后就立即返回给用户了但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此使用消息队列进行异步处理之后需要适当修改业务流程进行配合比如用户在提交订单之后订单数据写入消息队列不能立即返回用户订单提交成功需要在消息队列的订单消费者进程真正处理完该订单之后甚至出库后再通过电子邮件或短信通知用户订单成功以免交易纠纷。这就类似我们平时手机订火车票和电影票
1.2.2削峰/限流
先将短时间高并发产生的事务消息存储在消息队列中然后后端服务再慢慢根据自己的能力去消费这些消息这样就避免直接把后端服务打垮掉。举例在电子商务一些秒杀、促销活动中合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示 1.2.3降低系统耦合性
使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用那么新增模块或者修改模块就对其他模块影响较小这样系统的可扩展性无疑更好一些。还是直接上图吧 消息队列使用发布-订阅模式工作消息发送者生产者发布消息一个或多个消息接受者消费者订阅消息。 从上图可以看到消息发送者生产者和消息接受者消费者之间没有直接耦合消息发送者将消息发送至分布式消息队列即结束对消息的处理消息接受者从分布式消息队列获取该消息后进行后续处理并不需要知道该消息从何而来。对新增业务只要对该类消息感兴趣即可订阅该消息对原有系统和业务没有任何影响从而实现网站业务的可扩展性设计。
1.2.4实现分布式事务
RocketMQ、 Kafka、Pulsar、QMQ 都提供了事务相关的功能。事务允许事件流应用将消费处理生产消息整个过程定义为一个原子操作。
1.3消息队列的缺点
系统可用性降低 系统可用性在某种程度上降低为什么这样说呢在加入 MQ 之前你不用考虑消息丢失或者说 MQ 挂掉等等的情况但是引入 MQ 之后你就需要去考虑了系统复杂性提高 加入 MQ 之后你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题一致性问题 我上面讲了消息队列可以实现异步消息队列带来的异步确实可以提高系统响应速度。但是万一消息的真正消费者并没有正确消费消息怎么办这样就会导致数据不一致的情况了
1.4JMS和AMQP JMSjava message servicejava消息服务 支持java平台不跨语言本质就是javaAPI相当于就是一个规范。提供大量的message结构 AMQPadvanced message queuing protocol高级消息队列协议 跨语言跨平台是一个网络线级协议。只提供byte数组传输。RabbitMQ是AMQP的实现
对比如下 1.4.1 JMS的两种消息模型
1点对点P2P模型 使用**队列Queue*作为消息通信载体满足*生产者与消费者模式一条消息只能被一个消费者使用未被消费的消息在队列中保留直到被消费或超时。比如我们生产者发送 100 条消息的话两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半也就是你一个我一个的消费。
2发布/订阅Pub/Sub模型
发布订阅模型Pub/Sub 使用**主题Topic)*作为消息通信载体类似于*广播模式发布者发布一条消息该消息通过主题传递给所有的订阅者
1.5消息队列技术选型
常见的消息队列有哪些Kafka、
1.5.1 Kafka
Kafka 是 LinkedIn 开源的一个分布式流式处理平台已经成为 Apache 顶级项目早期被用来用于处理海量的日志后面才慢慢发展成了一款功能全面的高性能消息队列。
1特点
消息队列发布和订阅消息流这个功能类似于消息队列这也是 Kafka 也被归类为消息队列的原因。容错的持久方式存储记录消息流Kafka 会把消息持久化到磁盘有效避免了消息丢失的风险。流式处理平台 在消息发布的时候进行处理Kafka 提供了一个完整的流式处理类库。
Kafka 是一个分布式系统由通过高性能 TCP 网络协议进行通信的服务器和客户端组成可以部署在在本地和云环境中的裸机硬件、虚拟机和容器上。
1.5.2 RocketMQ
RocketMQ 是阿里开源的一款云原生“消息、事件、流”实时数据处理平台借鉴了 Kafka已经成为 Apache 顶级项目。
1特点
云原生生与云长与云无限弹性扩缩K8s 友好高吞吐万亿级吞吐保证同时满足微服务与大数据场景。流处理提供轻量、高扩展、高性能和丰富功能的流计算引擎。金融级金融级的稳定性广泛用于交易核心链路。架构极简零外部依赖Shared-nothing 架构。生态友好无缝对接微服务、实时计算、数据湖等周边生态。
1.5.3 RabbitMQ
RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol高级消息队列协议的消息中间件它最初起源于金融系统用于在分布式系统中存储转发消息。
1特点
可靠性 RabbitMQ 使用一些机制来保证消息的可靠性如持久化、传输确认及发布确认等。灵活的路由 在消息进入队列之前通过交换器来路由消息。对于典型的路由功能RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能可以将多个交换器绑定在一起也可以通过插件机制来实现自己的交换器。这个后面会在我们讲 RabbitMQ 核心概念的时候详细介绍到。扩展性 多个 RabbitMQ 节点可以组成一个集群也可以根据实际业务情况动态地扩展集群中节点。高可用性 队列可以在集群中的机器上设置镜像使得在部分节点出现问题的情况下队列仍然可用。支持多种协议 RabbitMQ 除了原生支持 AMQP 协议还支持 STOMP、MQTT 等多种消息中间件协议。多语言客户端 RabbitMQ 几乎支持所有常用语言比如 Java、Python、Ruby、PHP、C#、JavaScript 等。易用的管理界面 RabbitMQ 提供了一个易用的用户界面使得用户可以监控和管理消息、集群中的节点等。在安装 RabbitMQ 的时候会介绍到安装好 RabbitMQ 就自带管理界面。插件机制 RabbitMQ 提供了许多插件以实现从多方面进行扩展当然也可以编写自己的插件。感觉这个有点类似 Dubbo 的 SPI 机
1.5.4技术选型
对比方向概要吞吐量万级的 ActiveMQ 和 RabbitMQ 的吞吐量ActiveMQ 的性能最差要比十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。可用性都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 Kafka 也是分布式的一个数据多个副本少数机器宕机不会丢失数据不会导致不可用时效性RabbitMQ 基于 Erlang 开发所以并发能力很强性能极其好延时很低达到微秒级其他几个都是 ms 级。功能支持Pulsar 的功能更全面支持多租户、多种消费模式和持久性模式等功能是下一代云原生分布式消息流平台。消息丢失ActiveMQ 和 RabbitMQ 丢失的可能性非常低 Kafka、RocketMQ 和 Pulsar 理论上可以做到 0 丢失。