中间件(MQ中间件)

JMS

       java message service,定义的一种java消息规范

消息模型

1. 点对点/队列

       1.1 消息生产者生产消息发送到queue中,然后消费者从queue中取出并且消费消息。

       1,2 消息被消费以后,queue中不再存储,所以消息消费者不再消费已经被消费的消息。

       1.3 queue支持存在多个消费者,但一个消息只会被一个消费者消费。

       特点:每个消息只有一个消费者,消息在中间件中可以被持久化,发送者和消费者没有时间限制。

2. 发布者/订阅者

       消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。发布到topic的消息会被所有订阅者消费。

       特点:每个消息可以被多个订阅者消费,消息分为持久订阅和非持久订阅。持久订阅:订阅关系确立后,消息就不会消失,不管订阅者是否在线;非持久订阅,订阅者必须保持在线才能接受到消息

实现JMS的消息中间件

       常见有ActiveMQ、RocketMQ、RabbitMQ,Kafka等

消息中间件

  • 分布式系统中完成消息的发送和接收的组件

作用:典型的异步处理;应用解耦;流量削锋;消息通讯

现有两个独立的系统A和B

异步处理:

       A通过调用消息中间件的API,推送消息到消息中间件的主题或队列,且无需等待,

       B通过向消息中间订阅或监听可以获取此消息。

       A和B之间无需同步回应,整个过程是异步的

解耦:

       A(发送者)和B(接收者)不需了解对方API,只需要确认消息

       A和B不需要同时在线,不需要向对方回应

       如:交易系统为了保持数据一致性,支付系统把支付结果放在消息中间件中,通知订单系统修改订单状态,完成解耦

流量削锋

       当两个"上下游"系统处理能力存在差距时,利用消息队列做一个通用的"漏斗",进行限流控制。在下游有能力处理的时候,再进行分发。

       如:用户在支付系统成功结账后,订单系统会通过短信系统向用户推送扣费通知。 短信系统可能由于短板效应,速度卡在网关上(每秒几百次请求),容易造成支付系统和短信系统的处理能力出现差异化。然而用户晚点收到短信,一般是不会有太大问题的。如果没有消息队列,两个系统可能存在定时、拥塞等问题。可以将消息队列当成可靠的消息暂存地,进行一定程度的消息堆积

       利用中间件转储两个系统的通信内容,并在下游系统有能力处理这些消息的时候,再处理这些消息。

消息通讯

如:短信系统,邮件系统都是常见的利用中间件进行操作的实例

       我在业务中常遇到一次性消费的问题,如某个流程是A用户给B用户开单或转发派单,每次操作都要求发送给B通知短信。当时没有用到中间件,只能在数据库中添加字段,标记是否已发送短信。开单时如果状态值是未发送,就发送一次短信,将状态值修改为已发送,发送成功后重新修改为未发送,防止下次操作不发送短信。

       但这样有许多问题,第一数据库的字段不是能随便加的,第二会经常对数据库进行读写操作,给数据库带来压力,第三如果并发量增加,可能会造成短信平台拥堵,本系统与短信平台耦合性较高造成数据错误

       因此如果能使用消息队列或成熟的消息件,就能利用中间件的特性良好的解决此问题。

 

 

 

### 中间件 MQ 的原理及实现 消息中间件(Message Queue, MQ)是一种用于分布式系统之间的通信工具,其核心功能是通过异步传递机制来解耦生产者和消费者的业务逻辑。以下是关于 MQ 的基本原理及其实现的关键点: #### 1. **MQ 的工作原理** MQ 主要通过队列的方式存储消息,并允许生产者将消息写入队列,而消费者则可以从队列中读取消息并进行处理。这种模式实现了生产者和消费者之间的松散耦合[^1]。 - 生产者负责创建消息并将它们发送到指定的消息队列。 - 消费者订阅这些队列并接收消息以执行相应的操作。 - 队列作为缓冲区,在高并发场景下可以平滑流量高峰,防止下游服务因瞬时负载过高而导致崩溃[^4]。 #### 2. **MQ 的主要特性** - **异步通信**:生产者无需等待消费者完成任务即可继续其他操作,从而提高系统的整体效率。 - **可靠性保障**:大多数 MQ 提供持久化支持,即使发生宕机也能保证消息不丢失。 - **扩展性强**:可以通过增加更多的消费者实例轻松应对增长的工作量。 然而,MQ 存在一些局限性,例如无法实现实时交互以及缺乏对调用响应的支持[^2]。 --- ### 中间件 MQ 的使用教程 为了更好地理解如何实际应用 MQ 技术,下面提供了一个基于 RabbitMQ 和 JMS 的简单示例。 #### 3. **RabbitMQ 实现案例** 假设我们需要构建一个简单的订单处理流程,其中涉及向客户发送确认邮件的任务。 ##### 步骤说明 - 创建一个 RabbitMQ 连接并通过交换器绑定至目标队列。 - 将待处理的数据序列化成 JSON 字符串形式存入消息体中。 - 设置必要的属性如 TTL 时间以便超期未被消费的消息自动清除。 ```python import pika import json def send_message(queue_name, message_data): connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # Declare the queue to ensure it exists. channel.queue_declare(queue=queue_name) # Convert data into a string format suitable for transmission over network protocols. serialized_payload = json.dumps(message_data).encode('utf-8') # Publish the payload onto specified routing key associated with our declared exchange type. channel.basic_publish(exchange='', routing_key=queue_name, body=serialized_payload) print(f"Sent {message_data} to '{queue_name}'") if __name__ == '__main__': order_details = {"order_id": 1024, "customer_email": "example@example.com"} send_message('email_notifications', order_details) ``` 上述脚本展示了如何利用 Python 库 `pika` 向名为 `email_notifications` 的队列推送新订单详情的通知事件。 #### 4. **IBM MQ 开发指南** 对于企业级解决方案而言,IBM MQ 是另一个广泛使用的选项。它提供了丰富的 API 接口满足不同平台上的集成需求。开发者可以根据具体项目情况查阅官方文档获取更详细的指导信息[^3]。 --- ### 总结 综上所述,消息中间件不仅能够显著提升应用程序架构灵活性还增强了容错能力。尽管如此,选用合适的方案仍需综合考虑特定应用场景下的各种因素影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值