合肥网站建设解决方案怎么做品牌推广网站

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

合肥网站建设解决方案,怎么做品牌推广网站,常州网络公司联系方式,如何直接用jsp做网站不写servlet目录 为什么用MQ#xff1f; 异步 、削峰、解耦1. 异步处理2. 解耦3. 削峰填谷 Exchange类型什么是死信队列#xff1f;如何保证消息的可靠性#xff1f;RabbitMQ中如何解决消息堆积问题?RabbitMQ中如何保证消息有序性?如何防止消息重复消费#xff1f;(如何保证消息幂等… 目录 为什么用MQ 异步 、削峰、解耦1. 异步处理2. 解耦3. 削峰填谷 Exchange类型什么是死信队列如何保证消息的可靠性RabbitMQ中如何解决消息堆积问题?RabbitMQ中如何保证消息有序性?如何防止消息重复消费(如何保证消息幂等性) 为什么用MQ 异步 、削峰、解耦 MQMessage Queue消息队列是一种在分布式系统中进行消息传递的技术它主要用于实现服务间的 解耦、异步处理、削峰填谷等功能。下面我将分别解释这几个概念并说明它们是如何通过MQ实现的。

  1. 异步处理 异步处理是指一个操作不需要等待另一个操作完成就可以继续执行的过程。 在传统的同步模式下客户端发送请求后必须等待服务器响应才能继续执行后续操作而在异步模式下客户端发送请求后无需等待可以立即返回并执行其他任务服务器处理完请求后再通知客户端结果。 MQ如何实现异步处理 当客户端向服务端发送请求时该请求不是直接被服务端处理而是先存入MQ中。服务端从MQ中获取请求消息后进行处理客户端无需等待服务端处理完成即可继续执行其他任务。这种方式提高了系统的响应速度和吞吐量使得系统能够处理更多的并发请求。
  2. 解耦 解耦是指降低系统各组件之间的依赖性使得每个组件都可以独立地开发、部署和扩展。这有助于提高系统的灵活性和可维护性。 MQ如何实现解耦 发送方将消息发送到MQ中而接收方从MQ中读取消息。这样发送方和接收方之间就不存在直接的调用关系。即使接收方暂时不可用发送方也可以继续发送消息因为消息会被暂存在MQ中直到接收方恢复可用。发送方和接收方可以独立扩展而不影响彼此的工作。
  3. 削峰填谷 削峰填谷是指通过缓存、异步处理等手段来平衡系统的负载避免高峰期系统过载或低谷期资源浪费的情况。 MQ如何实现削峰填谷 在高流量期间系统产生的大量消息会被存入MQ中而不是直接由后端服务处理。这可以防止后端服务因短时间内处理大量请求而过载。当流量高峰过去后后端服务可以从MQ中慢慢消费这些消息从而平衡处理过程确保服务质量。通过这种方式系统能够在高峰期吸收额外的请求在低谷期释放资源从而达到资源的有效利用。 综上所述MQ作为一种重要的中间件技术对于提升系统的性能、稳定性和可扩展性具有重要作用。 Exchange类型 常用的交换机有以下三种因为消费者是从队列获取信息的队列是绑定交换机的所以对应的消息推送/接收模式也会有以下几种 Direct Exchange 直连型交换机根据RoutingKey路由键路由到不同的队列Fanout Exchange 扇型广播交换机这个交换机没有路由键概念就算你绑了路由键也是无视的。 这个交换机在接收到消息后会直接转发到绑定到它上面的所有队列。Topic Exchange 主题交换机这个交换机其实跟直连交换机流程差不多但是它的特点就是在它的路由键和绑定键之间是有规则的。 简单地介绍下规则 * (星号) 用来表示一个或多个字符# (井号) 用来表示任意数量的字符 什么是死信队列 死信Dead Letter:是指在消息队列系统中那些无法被正常消费的消息。 死信队列Dead Letter Queue, DLQ当消息无法被正常处理时也就是死信可以将这些死信发送到一个专门的队列中以便于后续检查和处理 以下是一些可能导致消息成为死信的情况 消息被拒绝访问消费者显式地拒绝了消息使用 channel.BasicNack 或 channel.BasicReject 方法并且设置了 requeue 参数为 false这意味着消息不应该被重新放回原队列。消费者发生异常超过重试次数 。 其实spring框架调用的就是 basicNack消息过期如果消息设置了生存时间Time To Live, TTL并且超过了这个时间限制消息就会变为死信。队列达到最大长度如果消息队列达到了最大长度限制新的消息将无法加入队列这时这些新消息也会变成死信。 如何保证消息的可靠性 消息丢失场景 消息到 MQ 的过程中搞丢MQ 自己搞丢MQ 到消费过程中搞丢。 生产端消息可靠性保证 消息持久化 当生产者发布消息时,可以选择将其标记为持久化到磁盘上。 确认Confirm机制 开启confirm回调模式后RabbitMQ会在消息成功写入到磁盘并至少被一个交换器接受后向生产者发送一个确认acknowledgement。 若消息丢失或无法投递给任何队列RabbitMQ将会发送一个否定确认nack). 生产者可以根据这些确认信号判断消息是否成功送达并采取相应的重试策略。
    消费端消息可靠性保证 消息确认Acknowledgements 手动应答代码冗余多容易出现死循环。自动应答开启重试功能发生错误时重新发送可配置死信队列重试一定次数后放入死信队列。 死信队列Dead Letter Queue
    RabbitMQ中如何解决消息堆积问题? 解决消息堆积有三种种思路: 扩大队列容积提高堆积上限采用惰性队列 在声明队列的时候可以设置属性x-queue-mode为lazy即为惰性队列基于磁盘存储消息上限高性能比较稳定但基于磁盘存储受限于磁盘I0时效性会降低 增加更多消费者提高消费速度不能保证有序性在消费者内开启线程池加快消息处理速度不能保证有序性 RabbitMQ中如何保证消息有序性? 单个队列与单一消费者: 单个队列将所有需要保持有序的消息发送到同一个队列中。RabbitMQ的队列是先进先出FIFO的数据结构消息在被发送到队列之后会按照发送的顺序被排列在队列中。单一消费者确保该队列只被一个消费者单线程处理。这样消费者会按照队列中的顺序接收到消息并依次处理从而保证了消息的顺序性。 如何防止消息重复消费(如何保证消息幂等性) 幂等性指的是一个操作无论执行多少次其结果都是相同的。 在分布式系统和消息队列中幂等性特别重要因为它可以确保即使在消息重复发送或处理过程中出现故障的情况下系统状态的一致性和数据的完整性。 生产端保证消息的幂等性 状态检查 在消息发送前先查询数据库确认此消息是否已被处理过一般通过单据状态。如果是则直接忽略否则继续处理并在处理完成后更新消息状态为已处理。 消费端保证消息的幂等性 唯一标识每个消息都携带一个业务IDBizId如订单号、交易流水号等以便在消费端能够识别重复的消息。