沂南网站建设南京网站优化多少钱
web/
2025/10/4 16:20:41/
文章来源:
沂南网站建设,南京网站优化多少钱,wordpress 搜索框位置,湖北建设科技中心网站导入
一个技术的衍生必然是为了解决现实出现的问题#xff0c;在讲这个问题之前我们先了解一下传统开发中关于服务调用出现的问题#xff08;痛点#xff09;有哪些#xff1f; 我们为什么要使用MQ#xff1f;
①、同步——超时 在多服务体系架构中#xff0c;必然存在…导入
一个技术的衍生必然是为了解决现实出现的问题在讲这个问题之前我们先了解一下传统开发中关于服务调用出现的问题痛点有哪些 我们为什么要使用MQ
①、同步——超时 在多服务体系架构中必然存在着多个服务之间的调用关系当用户提交了订单订单服务会调用支付服务执行用户的金钱操作执行完毕之后紧接着调用商品服务对商家的商品信息库存、成交量、收入等进行更新执行完毕之后又调用物流服务对接发货公司、收发地带你对用户买的商品进行物流实时同步。每一次的服务调用都要等待另一个服务的执行完毕整个流程下来很耗时。对于系统来说要求实时性要强可立即得到结果而同步调用还存在着其他问题 资源浪费调用链中每个服务在等待响应过程中不能释放请求占用的资源高并发场景下会极度浪费系统资源 级联失败如果服务提供者出现问题所有调用方都会跟着出问题如同多米诺骨牌一样迅速导致真个微服务群鼓掌 ②、服务耦合高 订单服务需要分别调用支付服务、商品服务、物流服务调用者需要等待服务提供者响应但是如果作为上游服务的物流服务突然宕机这样会导致订单服务也会出现问题用户下单失败并且如果每次加入新需求此时如果还需要调用通信服务实时给用户同步下单情况这样一个需求我们就要修改原来的代码耦合度很高 ③、流量高峰 一般在秒杀或团抢活动中使用广泛。比方说订单系统经过测试组接口测试发现最多只能承受100万次请求而在面对618、双一这种购物狂潮的高峰期如果一下来了500万的请求系统时是无法处理的可能会导致数据库无法承受这么大的压力响应变慢或者直接挂掉 有没有什么办法能够帮助解决上面出现的问题呢面对上述的种种问题伟大的人类就提出了一个奇思妙想——把数据暂存。可不可把所有要传输的消息放在一个容器中当大量请求来的时候先把一部分的消息逻辑暂存在容器中然后慢慢去处理 于是出现了消息队列的概念 MQ简介
MQ是什么
Message Queue消息队列是基础数据结构中“先进先出”的一种数据结构。把要传输的消息数据放在队列中用队列机制来实现消息传递——生产者生产消息把消息放入队列然后消费者去处理。消费者可以到指定队列拉取消息或者订阅响应的队列由MQ服务端给其推送消息。 为什么要使用队列这种数据结构呢
我们知道队列具有先进先出的特点。而消息队列就是将消息放到队列里用队列做存储消息的介质看作是一个容器。那这里的消息我们可以指代文本字符串也可以是更复杂的嵌入对象。消息的发送放称为生产者消息的接收方称为消费者 MQ要解决什么问题
结合前面讲到应用场景出现的问题我们来针对性讨论一下方案
①、同步请求—异步请求 通过引入MQ之后我为了提升系统响应性能我们可以它改造为异步那异步请求有什么好处它是如何解决同步出现的问题
异步调用的本质是一种事件驱动模式 耦合度低不需要调用对方只需要发布事件事件去响应即可吞吐量提升不需要等待对方执行时间更短吞吐量更大故障隔离如果出现故障更容易排查流量削峰broker做缓存 ②、高耦合—低耦合 如果使用消息队列当订单服务执行完成之后发送一条消息到队列中其余三个服务读取到这条消息那么它立刻开始进行业务的执行。使用了消息队列后消息的发送方和接收方并不需要知道彼此这样相互之间也就是没有直接关系即解耦。 ③、削峰 这种峰值流量场景一般是集中于一小段时间内为了防止系统在这个峰值时间内被流量冲垮可以采用消息队列来削弱峰值流量此时的消息队列就可以理解为是一个缓冲区比方说系统只能处理100万请求但此时同时有500万请求来临我们就可以把把多余的400万请求先放到队列中等系统根据自己处理请求的能力去消息队列去消费。 一般用来解决应用解耦异步消息流量削峰等问题目的是为了实现高性能、高可用、可伸缩和最终一致性架构 MQ的产品有哪些
RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka、IBM WebSphere 等 通过我提出来的应用场景想必大家对于为什么要使用MQ有了初步的了解接下来我们重点讨论一下RabbitMQ RabbitMQ
RabbitMQ是什么
RabbitMQ是一个由Erlang语言开发的AMQP的开源中间件 补充AMQP是什么 AMQP我们可以看作是一种协议活规范而RabbitMQ是基于这个协议下的实现框架。类似于JDBC和mysql RabbitMQ的工作原理是什么
架构图 组件 描述 生产者Producer 发送消息的应用程序将消息发送到Broker 消费者Consumer 接收消息的应用程序从RabbitMQ Broker获取消息进行处理 Broker RabbitMQ消息代理服务器负责接收和分发消息。 交换机Exchange 接收生产者发送的消息并根据路由键routingKey规则将消息路由到跟交换机绑定的一个或多个队列。 交换机主要用来将生产者生产出来的消息传送到对应的队列中即交换机是一个消息传送的媒介具有存储-转发功能如果路由不到或许会返回给 Producer(生产者) 或许会被直接丢弃掉 绑定Binding 定义交换机和队列之间的关系指定消息的路由规则。 路由键Routing Key 生产者在发送消息时将消息附带的路由键发送给交换机交换机根据路由键将消息路由到相应的队列。 生产者将消息发给交换器的时候一般会指定一个 RoutingKey(路由键)用来指定这个消息的路由规则而这个 RoutingKey 需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效 队列Queue 存储消息的容器消费者从队列中获取消息进行处理。 它是消息的容器也是消息的终点 整个消息传输流程为
1. 生产者将消息发送到交换机
2. 交换机根据路由键将消息路由到相应的队列
3. 消费者从队列中获取消息进行处理。 RabbitMQ有哪些工作模式
官方网站RabbitMQ Tutorials — RabbitMQ
①、Simple简单工作模式
特点一个队列只有一个消费者
消息分发的方式。不同工作模式指的是消息路由的策略和方式不同 内部使用的默认交换机
生产者将消息发送到队列消费者从队列取出消息 ②、Work Queues工作模式
特点多个消费者监听同一个队列 在一个队列中如果有多个消费者消费者之间对于同一个消息的关系是竞争关系同一条消息只能由一个消费者消费。但是分担压力比方说有10条消息C1处理13579消息C2处理246810消息。顺序取消息C1取一条C2取一条消费规则是轮询 应用场景 ③、Pub/Sub订阅模式
特点多个消息队列每个消息队列有一个消费者监听
X交换机
生产者生产了消息发给交换机交换机路由分发给不同的消费者消费者监听获取消息。一个消息可以被多个消费者同时接收消费 每个消费者都监听自己的队列 使用场景 A服务可以通过异常处理如果A服务发送后出现问题可以回滚什么都有可能出现问题而我们的目的是保持一致性 ④、Routing路由模式
特点一个交换机绑定多个消息队列每个消息队列都有自己唯一的key每个消息队列有一个消费者监听 Topics通配符/主题模式 *一个单词 #零个或多个单词 实战演练
依赖
dependenciesdependencygroupIdcom.rabbitmq/groupIdartifactIdamqp-client/artifactIdversion5.6.0/version/dependency
/dependencies 生产者
package com.itheima.producer;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Producer_HelloWorld {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost(114.115.170.214);factory.setPort(5672);factory.setVirtualHost(/itcast);factory.setUsername(admin);factory.setPassword(admin);//3.创建连接 ConnectionConnection connection factory.newConnection();//4.创建ChannelChannel channel connection.createChannel();//5.创建队列Queuechannel.queueDeclare(denglimei,true,false,false,null);//要发送的消息String body hello rabbitmq~~~;//6.发送消息channel.basicPublish(,denglimei,null,body.getBytes());//7.释放资源channel.close();connection.close();}
} 消费者
package com.itheima.consumer;import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer_HelloWorld {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost(114.115.170.214);factory.setPort(5672);factory.setVirtualHost(/itcast);factory.setUsername(admin);factory.setPassword(admin);//3.创建连接 ConnectionConnection connection factory.newConnection();//4.创建ChannelChannel channel connection.createChannel();//5.创建队列Queuechannel.queueDeclare(hello_world,true,false,false,null);//匿名内部类Consumer consumer new DefaultConsumer(channel){/** 回调方法当收到消息后会自动执行该方法* 1.consumerTag标识* 2.envelope获取一些信息交换机路由key* 3.properties配置信息* 4.body数据* */Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {long start System.currentTimeMillis();for (int i 0; i 10000; i) {System.out.println(第i条);}long end System.currentTimeMillis();System.out.println(start-end);}};//接收消息channel.basicConsume(hello_world,true,consumer);//注意消费者作为监听者不要去关闭资源否则如何监听资源}
} 总结
本次先对MQ和衍生出来的RabbitMQ先做了基本介绍后续会针对RabbitMQ如何在项目中如何进行削峰、如何解决死信队列等内容做具体介绍敬请期待~ 如果有想要交流的内容欢迎在评论区进行留言如果这篇文档受到了您的喜欢那就留下你点赞收藏评论脚印支持一下博主~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86864.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!