遵义做网站建设哪家公司好,企业网站推广价格,企业文化心得体会总结,建设一个视频网站需要什么文章目录MQ用来做什么的MQ会有什么样的麻烦MQ消息队列模式分类MQ消息队列常用协议市场主流四大MQRabbitMQ项目开发RabbitMQ中的组成部分MQ用来做什么的
省流 #xff1a;系统解耦、异步调用、流量削峰
系统解耦 首先举例下面这个场景#xff0c;现有ABCDE五个系统#xff…
文章目录MQ用来做什么的MQ会有什么样的麻烦MQ消息队列模式分类MQ消息队列常用协议市场主流四大MQRabbitMQ项目开发RabbitMQ中的组成部分MQ用来做什么的
省流 系统解耦、异步调用、流量削峰
系统解耦 首先举例下面这个场景现有ABCDE五个系统最初的时候BCD三个系统都要调用A系统的接口获取数据一切都很正常但是突然D系统说我不要了你不用给我传数据了A系统无奈只能修改代码将调用D系统的代码删除这时候还没删除呢E系统发送了请求但是A系统这时候还没处理完D系统的请求A系统卒彻底崩溃。 上述场景中BCDE都需要用到A系统提供的数据A系统跟其他四个系统严重耦合需要时时刻刻考虑其他四个系统要是挂了怎么办需不需要重新发送数据给他们这个时候的A系统内心是崩溃的。
但是如果使用了MQ之后 A系统的数据只需要放到MQ里面其他的系统想请求获取数据只需要去MQ里面消费即可如果突然不想请求了就取消对MQ的消费就行了A系统根本不需要考虑给谁去响应这个数据也不需要去维护代码也不用考虑其他系统是否调用成功失败超时等情况。 异步调用 ABCD四个系统A系统收到一个请求需要在自己本地写库还需要往BCD三个系统写库A系统自己写本地库需要3ms往其他系统写库相对较慢B系统200ms C系统350msD系统400ms这样算起来整个功能从请求到响应的时间为3ms200ms350ms400ms953ms接近一秒对于用户来说点个按钮要等这么长时间基本是无法接受的侧面也反映出这家研发人员技术不咋地。 一般的互联网企业对于用户请求响应的时间要求在100ms-200ms之间这样用户的眼睛存在视觉暂停现象用户响应时间在此范围内就可以了所以上面的现象是不可取的。
如果用了MQ用户发送请求到A系统耗时3msA系统发送三条消息到MQ假如耗时5ms用户从发送请求到相应3ms5ms8ms仅用了8ms用户的体验非常好。 流量削峰 JD系统每天0—19点系统风平浪静结果一到八点抢购的时候每秒并发达到百万假设JD数据库没秒能处理1.5w条并发请求并非实际数据主要为了举例,到八点抢购的时候每秒并发百万这直接导致系统异常但是八点一过可能也就几万用户在线操作每秒的请求可能也就几百条对整个系统毫无压力。
如果使用了MQ每秒百万个请求写入MQ因为JD系统每秒能处理1W的请求JD系统处理完然后再去MQ里面再拉取1W的请求处理每次不要超过自己能处理的最大请求量就ok这样下来等到八点高峰期的时候系统也不会挂掉但是近一个小时内系统处理请求的速度是肯定赶不上用户的并发请求的所以都会积压在MQ中甚至可能积压千万条但是高峰期过后每秒只会有一千多的并发请求进入MQ但是JD系统还是会以每秒1W的速度处理请求所以高峰期一过JD系统会很快消化掉积压在MQ的请求在用户那边可能也就是等的时间长一点但是绝对不会让系统挂掉。
MQ会有什么样的麻烦
系统可用性降低 系统引入的外部依赖越多系统要面对的风险越高拿场景一来说本来ABCD四个系统配合的好好的没啥问题但是你偏要弄个MQ进来插一脚虽然好处挺多但是万一MQ挂掉了呢那样你系统不也就挂掉了。
系统复杂程度提高 非要加个MQ进来如何保证没有重复消费呢如何处理消息丢失的情况怎么保证消息传递的顺序问题太多。
一致性的问题 A系统处理完再传递给MQ就直接返回成功了用户以为你这个请求成功了但是如果在BCD的系统里BC两个系统写库成功D系统写库失败了怎么办这样就导致数据不一致了。
所以。消息队列其实是一套非常复杂的架构你在享受MQ带来的好处的同时也要做各种技术方案把MQ带来的一系列的问题解决掉等一切都做好之后系统的复杂程度硬生生提高了一个等级。
MQ消息队列模式分类
1. 点对点PTP 消息生产者生产消息发送到queue中然后消息消费者从queue中取出并且消费消息。 消息被消费以后queue中不再存储所以消息消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者但是对一个消息而言只会有一个消费者可以消费。 2. 发布/订阅 topic实现了发布和订阅当你发布一个消息所有订阅这个topic的服务都能得到这个消息所以从1到N个订阅者都能得到一个消息的拷贝。
MQ消息队列常用协议 AMQP协议MQTT协议STOMP协议XMPP协议 市场主流四大MQ
kafka、ActiveMQ、RabbitMQ、RocketMQ
RabbitMQ项目开发
超详细RabbitMQ入门这一篇就够了
1. 安装erLang语言配置环境变量 管网安装下载Winsdow10版本的erlang安装包 下载之后就得到这个东西 双击安装一直点next就行了安装完之后配置环境变量 使用cmd命令输入 erl -version 验证 2. 安装RabbitMQ服务器 在RabbitMQ的gitHub项目中下载windows版本的服务端安装包 下载之后得到这个东西 接着到双击安装一直点下一步安装即可安装完成后找到安装目录 在此目录下打开cmd命令进入到sbin目录下输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件 然后双击rabbitmq-server.bat启动脚本然后打开服务管理可以看到RabbitMQ正在运行 这时打开浏览器输入http://localhost:15672账号密码默认是guest/guest 到这一步安装就大功告成了 3. 开始HelloWorld 导入依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId
/dependency在application.yml文件写入配置信息
spring:rabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guest配置公共项目common
public class RabbitConfig{// RabbitMQ的队列主题名称public static final String RABBITMQ_DEMO_TOPIC rabbitmqDemoTopic;//RabbitMQ的DIRECT交换机名称public static final String RABBITMQ_DEMO_DIRECT_EXCHANGE rabbitmqDemoDirectExchange;//RabbitMQ的DIRECT交换机和队列绑定的匹配键DirectRoutingpublic static final String RABBITMQ_DEMO_DIRECT_ROUTING rabbitmqDemoDirectRouting;
}RabbitMQ中间组件的配置
Configuration
public class DirectRabbitConfig {Beanpublic Queue rabbitmqDemoDirectQueue() {/*** 1、name: 队列名称* 2、durable: 是否持久化* 3、exclusive: 是否独享、排外的。如果设置为true定义为排他队列。则只有创建者可以使用此队列。也就是private私有的。* 4、autoDelete: 是否自动删除。也就是临时队列。当最后一个消费者断开连接后会自动删除。* */return new Queue(RabbitMQConfig.RABBITMQ_DEMO_TOPIC, true, false, false);}Beanpublic DirectExchange rabbitmqDemoDirectExchange() {//Direct交换机return new DirectExchange(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_EXCHANGE, true, false);}Beanpublic Binding bindDirect() {//链式写法绑定交换机和队列并设置匹配键return BindingBuilder//绑定队列.bind(rabbitmqDemoDirectQueue())//到交换机.to(rabbitmqDemoDirectExchange())//并设置匹配键.with(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING);}
}生产者
Service
public class RabbitMQServiceImpl implements RabbitMQService {//日期格式化private static SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);Resourceprivate RabbitTemplate rabbitTemplate;Overridepublic String sendMsg(String msg) throws Exception {try {String msgId UUID.randomUUID().toString().replace(-, ).substring(0, 32);String sendTime sdf.format(new Date());MapString, Object map new HashMap();map.put(msgId, msgId);map.put(sendTime, sendTime);map.put(msg, msg);rabbitTemplate.convertAndSend(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_EXCHANGE, RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING, map);return ok;} catch (Exception e) {e.printStackTrace();return error;}}
}RestController
RequestMapping(/mall/rabbitmq)
public class RabbitMQController {Resourceprivate RabbitMQService rabbitMQService;/*** 发送消息* author java技术爱好者*/PostMapping(/sendMsg)public String sendMsg(RequestParam(name msg) String msg) throws Exception {return rabbitMQService.sendMsg(msg);}
}消费者
Component
RabbitListener(queues {RabbitMQConfig.RABBITMQ_DEMO_TOPIC})
public class RabbitDemoConsumer{RabbitHandlerpublic void process(Map map){System.out.println(消费者RabbitDemoConsumer从RabbitMQ服务端消费消息map.toString());}
}开始运行 运行前注意先运行服务器创建队列再运行客户端获取消息。如果顺序相反客户端先执行就会报错。
现在开始先启动生产者发送一条消息 最后再启动消费者进行消费。 避免没有队列 由于队列不存在启动消费者报错的这个问题。最好的方法是生产者和消费者都尝试创建队列怎么写呢有很多方式我这里用一个相对简单一点的
//实现BeanPostProcessor类使用Bean的生命周期函数
Component
public class DirectRabbitConfig implements BeanPostProcessor {//这是创建交换机和队列用的rabbitAdmin对象Resourceprivate RabbitAdmin rabbitAdmin;//初始化rabbitAdmin对象Beanpublic RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {RabbitAdmin rabbitAdmin new RabbitAdmin(connectionFactory);// 只有设置为 truespring 才会加载 RabbitAdmin 这个类rabbitAdmin.setAutoStartup(true);return rabbitAdmin;}//实例化bean后也就是Bean的后置处理器Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {//创建交换机rabbitAdmin.declareExchange(rabbitmqDemoDirectExchange());//创建队列rabbitAdmin.declareQueue(rabbitmqDemoDirectQueue());return null;}
}这样启动生产者就会自动创建交换机和队列不用等到发送消息才创建。
消费者需要加一点代码
Component
//使用queuesToDeclare属性如果不存在则会创建队列
RabbitListener(queuesToDeclare Queue(RabbitMQConfig.RABBITMQ_DEMO_TOPIC))
public class RabbitDemoConsumer {//...省略
}这样无论生产者还是消费者先启动都不会出现问题了~
RabbitMQ中的组成部分
Exchange消息队列交换机。按一定的规则将消息路由转发到某个队列。 Queue消息队列存储消息的队列。 Producer消息生产者。生产方客户端将消息同交换机路由发送到队列中。 Consumer消息消费者。消费队列中存储的消息。 文章转载自: http://www.morning.nsncq.cn.gov.cn.nsncq.cn http://www.morning.yrctp.cn.gov.cn.yrctp.cn http://www.morning.rszbj.cn.gov.cn.rszbj.cn http://www.morning.ldzxf.cn.gov.cn.ldzxf.cn http://www.morning.xsrnr.cn.gov.cn.xsrnr.cn http://www.morning.pdmml.cn.gov.cn.pdmml.cn http://www.morning.qgkcs.cn.gov.cn.qgkcs.cn http://www.morning.mlbdr.cn.gov.cn.mlbdr.cn http://www.morning.ctbr.cn.gov.cn.ctbr.cn http://www.morning.lwzpp.cn.gov.cn.lwzpp.cn http://www.morning.aa1585.com.gov.cn.aa1585.com http://www.morning.ftmzy.cn.gov.cn.ftmzy.cn http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn http://www.morning.hlxpz.cn.gov.cn.hlxpz.cn http://www.morning.nzcgj.cn.gov.cn.nzcgj.cn http://www.morning.rfhm.cn.gov.cn.rfhm.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.xlclj.cn.gov.cn.xlclj.cn http://www.morning.gjsjt.cn.gov.cn.gjsjt.cn http://www.morning.qpntn.cn.gov.cn.qpntn.cn http://www.morning.nsfxt.cn.gov.cn.nsfxt.cn http://www.morning.cpqwb.cn.gov.cn.cpqwb.cn http://www.morning.hlrtzcj.cn.gov.cn.hlrtzcj.cn http://www.morning.rbnnq.cn.gov.cn.rbnnq.cn http://www.morning.fygbq.cn.gov.cn.fygbq.cn http://www.morning.jspnx.cn.gov.cn.jspnx.cn http://www.morning.qiyelm.com.gov.cn.qiyelm.com http://www.morning.jfmjq.cn.gov.cn.jfmjq.cn http://www.morning.knscf.cn.gov.cn.knscf.cn http://www.morning.xmhpq.cn.gov.cn.xmhpq.cn http://www.morning.drggr.cn.gov.cn.drggr.cn http://www.morning.hdqqr.cn.gov.cn.hdqqr.cn http://www.morning.bpmft.cn.gov.cn.bpmft.cn http://www.morning.wrysm.cn.gov.cn.wrysm.cn http://www.morning.ymfzd.cn.gov.cn.ymfzd.cn http://www.morning.nchlk.cn.gov.cn.nchlk.cn http://www.morning.xdfkrd.cn.gov.cn.xdfkrd.cn http://www.morning.fpjxs.cn.gov.cn.fpjxs.cn http://www.morning.zhmgcreativeeducation.cn.gov.cn.zhmgcreativeeducation.cn http://www.morning.ktbjk.cn.gov.cn.ktbjk.cn http://www.morning.hytr.cn.gov.cn.hytr.cn http://www.morning.ldwxj.cn.gov.cn.ldwxj.cn http://www.morning.qfrsm.cn.gov.cn.qfrsm.cn http://www.morning.frnjm.cn.gov.cn.frnjm.cn http://www.morning.zstry.cn.gov.cn.zstry.cn http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.lmknf.cn.gov.cn.lmknf.cn http://www.morning.hpmzs.cn.gov.cn.hpmzs.cn http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.lfqnk.cn.gov.cn.lfqnk.cn http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.rnrwq.cn.gov.cn.rnrwq.cn http://www.morning.fwblh.cn.gov.cn.fwblh.cn http://www.morning.amlutsp.cn.gov.cn.amlutsp.cn http://www.morning.junmap.com.gov.cn.junmap.com http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn http://www.morning.ndcf.cn.gov.cn.ndcf.cn http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn http://www.morning.rdqzl.cn.gov.cn.rdqzl.cn http://www.morning.blznh.cn.gov.cn.blznh.cn http://www.morning.ryxyz.cn.gov.cn.ryxyz.cn http://www.morning.ndcjq.cn.gov.cn.ndcjq.cn http://www.morning.xlxmy.cn.gov.cn.xlxmy.cn http://www.morning.rgtp.cn.gov.cn.rgtp.cn http://www.morning.bhqlj.cn.gov.cn.bhqlj.cn http://www.morning.zlchy.cn.gov.cn.zlchy.cn http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn http://www.morning.cknsx.cn.gov.cn.cknsx.cn http://www.morning.fbdtd.cn.gov.cn.fbdtd.cn http://www.morning.flqbg.cn.gov.cn.flqbg.cn http://www.morning.hlyfn.cn.gov.cn.hlyfn.cn http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn http://www.morning.qjldz.cn.gov.cn.qjldz.cn http://www.morning.rdqzl.cn.gov.cn.rdqzl.cn http://www.morning.rykmf.cn.gov.cn.rykmf.cn http://www.morning.ftntr.cn.gov.cn.ftntr.cn http://www.morning.pphgl.cn.gov.cn.pphgl.cn http://www.morning.tntgc.cn.gov.cn.tntgc.cn http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn http://www.morning.hrypl.cn.gov.cn.hrypl.cn