沧州市网站建设公司,cms做视频网站,松岗做网站,网站不用了怎么办目录
一、MQ概述
二、MQ的优势和劣势 三、常见的MQ产品
RabbitMQ使用步骤
第一步#xff1a;确保rabbitmq启动并且可以访问15672
第二步#xff1a;导入依赖
第三步#xff1a;配置
auto自动确认
manual手工确认#xff08;推荐使用#xff01;可以防止消息丢失确保rabbitmq启动并且可以访问15672
第二步导入依赖
第三步配置
auto自动确认
manual手工确认推荐使用可以防止消息丢失
第四步编写生产者和消费者 一、MQ概述 MQ 全称是Message Queue消息队列是在消息传输过程中保存消息的容器多用于分布式 系统之间进行通信。
二、MQ的优势和劣势 优势 应用解耦 : 系统的耦合性越高容错性就越低可维护性就越低使用MQ 使得应用间解耦 提升容错性和可维护性。 异步提速 : 提升用户体验和系统吞吐量单位时间内处理请求的数目。 削锋填谷 : 使用了MQ之后限制消费消息的速度为2000这样一来高峰期产生的数据势必 会被积压在 MQ中高峰 就被“削”掉了。但是因为消息积压在高峰期过后的一段时间内消费消息的速度还是会维持在1000直到消费完积压的消息这就叫做 “填谷”。使用MQ后可以提高系统稳定性。 劣势 系统的可用性降低 : 引入的外部依赖越多系统稳定性越差一旦MQ宕机会对业务系统造 成影响。如何保证MQ的高可用 系统复杂度提高 : MQ的加入增加了系统的复杂度以前是系统间同步的远程调用现在是 通过MQ进行一部调用怎么处理消息丢失情况如何保证消息传递的顺序性。 一致性问题 : A系统发给BCD系统若其中一个系统处理数据失败如何保证消息数据处理的 一致性问题。 三、常见的MQ产品 RabbitMQ使用步骤
第一步确保rabbitmq启动并且可以访问15672 第二步导入依赖 !-- rabbitmq --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency
第三步配置 rabbitmq:host: ipport: 5672username: guestpassword: guestvirtual-host: /listener:simple:prefetch: 1 # 默认每次取出一条消息消费 消费完成取下一条acknowledge-mode: manual # 设置消费端手动ack确认 不写默认为自动确认(auto)retry:enabled: true # 是否支持重试publisher-confirm-type: correlated #确认消息已发送到交换机(Exchange)publisher-returns: true #确认消息已发送到队列(Queue) auto自动确认
消息成功被消费没有抛出异常则自动确认回复ack。当抛出ImmediateAcknowledgeAmqpException异常则视为成功消费确认该消息。当抛出AmqpRejectAndDontRequeueException异常的时候则消息会被拒绝丢弃并且不会重新入队。其他的异常则消息会被拒绝且requeue true默认就是true时会重新入队
manual手工确认推荐使用可以防止消息丢失
无论有没有异常标准只有是否主动调用basicAck()、basicNack()等方法没有调用则一直阻塞.
因此有异常时(有重试就重试)抛出异常后没有调用时还是会一直阻塞。即使是auto模式的那两个特殊的异常在manual中都是一样的不会有特殊处理. 官网对应模式介绍RabbitMQ Tutorials | RabbitMQ 第四步编写生产者和消费者 这里写一个登录成功发送消息给登录人的业务普通队列模式
P生产者也就是要发送消息的程序C消费者消息的接受者会一直等待消息到
生产者 String exchange交换机名 交换器的名称。交换器是一种逻辑实体用于分发消息到相应的队列。你可以创建自定义的交换器类型如 Direct、Fanout、Topic 或者 Headers 等。 String routingKey队列名 路由键。它是消息与队列之间的桥梁决定了消息将被发送到哪个队列。路由键的值应匹配队列绑定到交换器时所使用的键。 Object message消息对象 要发送的消息对象。这个对象将被转换成字节流然后发送到 RabbitMQ。Spring AMQP 使用 MessageConverter 将 Java 对象转换为 AMQP 格式的字节流。默认情况下SimpleMessageConverter 可以处理简单的字符串、Java 序列化对象等。你可以通过配置 RabbitTemplate 的 messageConverter 属性来自定义消息转换器。 MessagePostProcessor messagePostProcessor 这是一个接口用于在消息发送前对其进行进一步的修改。你可以在这个处理器中设置消息头、属性或其他特定信息。MessagePostProcessor 接口有一个方法 postProcessMessage(Message message)你可以在这里修改消息实例。 CorrelationData correlationData 相关数据主要用于跟踪消息的发送结果。在异步发送消息的情况下你可以使用此参数来关联发送请求和响应。CorrelationData 包含一个唯一标识符用于识别消息。当收到响应时可以通过这个标识符找到原始请求。 发邮件是发给一个人所以这里只需要传一个队列名和登录人对象。发送给多个队列时需 要用到交换机 消费者
//Header从消息头中提取消息的递送标签标签是唯一的对应唯一的消息
RabbitListener(queuesToDeclare Queue(login_queue))
public void test01(User getUser, Channel channel, Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag)
{try {发送邮件的代码……//手动确认消息channel.basicAck(deliveryTag,true);} catch (MessagingException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}如果配置了手工消费一定要消费完后手动确认消息不然就会重复接收该消息导致后面的消息接受不到