直接进入正题。服务器
一.异步处理并发
场景:发送手机验证码,邮件异步
传统古老处理方式以下图学习
这个流程,所有在主线程完成,注册-》入库-》发送邮件-》发送短信,因为都在主线程,因此要等待每一步完成才能继续执行。因为每一步的操做时间响应时间不固定,因此主线程的请求耗时可能会很是长,若是请求过多,会致使IIS站点巨慢,排队请求,甚至宕机,严重影响用户体验。spa
如今大多数的处理方式以下图线程
这个作法是主线程只作耗时很是短的入库操做,发送邮件和发送短信,会开启2个异步线程,扔进去并行执行,主线程无论,继续执行后续的操做,这种处理方式要远远好过第一种处理方式,极大的加强了请求响应速度,用户体验良好。缺点是,因为异步线程里的操做都是很耗时间的操做,一个请求要开启2个线程,而一台标准配置的ECS服务器支撑的并发线程数大概在800左右,假设一个线程在10秒作完,这个单个服务器最多能支持400个请求的并发,后面的就要排队。出现这种状况,就要考虑增长服务器作负载,尴尬的增长成本。日志
消息队列RabbitMq的处理方式中间件
这个流程是,主线程依旧处理耗时低的入库操做,而后把须要处理的消息写进消息队列中,这个写入耗时能够忽略不计,很是快,而后,独立的发邮件子系统,和独立的发短信子系统,同时订阅消息队列,进行单独处理。处理好以后,向队列发送ACK确认,消息队列整条数据删除。这个流程也是如今各大公司都在用的方式,以SOA服务化各个系统,把耗时操做,单独交给独立的业务系统,经过消息队列做为中间件,达到应用解耦的目的,而且消耗的资源很低,单台服务器能承受更大的并发请求。blog
二.应用解耦队列
以电商的下订单为例子,假设中间的流程为下单=》减库存=》发货
第一种方式,经过连续操做表,在单一系统中,经过主线程,连续操做。呵呵哒,这种作法,相信不少人刚入门,甚至几年经验了,因为项目小,也在继续使用吧。用户量少,或者都是内部人使用,必然没问题,由于不会在乎出的问题,这种作法,只要一个环节出问题,请求直接报错,致使用户懵逼,假设在执行到减库存操做报错了,整个流程没有用事务回滚的话,还会形成数据不一致。
第二种方式,把这三个业务,拆成三个独立系统,经过JSON方式相互调用请求。这个作法,其实已经很不错了,起码独立出来,各自作各自的事情,必定程度上减少了整个系统的耦合性。可是问题是,就算是经过API形式请求,发送请求的系统通常状况下会等待被请求方的响应,若是响应错了,整个程序仍是会终止,前面的业务系统假如已经作了入库操做,就必需要混滚了。很麻烦。若是说不等待被请求方响应的话,若是出错,若是还要保证数据一致性,就要作更多的操做,去补全数据,好比,下单成功,减库存失败,发货成功,这样当减库存系统修复后,就要经过订单数据,去补库存表的对应数据。先对麻烦,难处理。
第三种方式,
把消息队列做为中间件,当订单系统下完单后,把数据消息写入消息队列中,库存系统和发货系统同时订阅这个消息队列,思想上和纯API系统调用相似,可是,消息队列RabbitMq自己的强大功能,会帮咱们作大量的出错善后处理,仍是,假设下单成功,库存失败,发货成功,当咱们修复库存的时候,不须要任何管数据的不一致性,由于库存队列未被处理的消息,会直接发送到库存系统,库存系统会进行处理。实现了应用的大幅度解耦。
三.流量削峰
这个主要用在团购,秒杀活动中
这个主要原理就是,控制队列长度,当请求来了,往队列里写入,超过队列的长度,就返回失败,给用户报一个可爱的错误页的等等。
四.日志处理
这个场景应该都很熟悉,一个系统有大量的业务须要各类日志来保证后续的分析工做,并且实时性要求不高,用队列处理再好不过了
五.消息通信
如今上线的各大社交通信项目中,其实是没有用消息队列作即时通信的,可是它确实能够用来作,有兴趣的不妨去试试吧
这个是点对点通讯,消费者A和B同时订阅消息队列,又同时是制造者,就能实现点对点通讯
群聊的作法,全部客户端同时订阅队列,又同时是发送,制造者。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
上述大体的5种RabbitMq的应用场景,下面来介绍几个消息队列的区别
ActiveMq:这个应用于JAVA中间件较多
ZeroMq:这个是分发效率最高的队列,是其余队列的十倍以上,缺点是不能数据持久化。
kafka:这是一种高吞吐量的发布订阅消息系统,当每秒达到10W+的分发要求时,能够用这个尝试,新浪微博就是用这个作分发。
先写这么多吧,大体的应用场景,欢迎各路大神来补充,我也是公司须要,学习整理出来的,可能会有理解误差,见谅哈!