直接进入正题。

一.异步处理

场景:发送手机验证码,邮件

传统古老处理方式如下图

这个流程,全部在主线程完成,注册-》入库-》发送邮件-》发送短信,由于都在主线程,所以要等待每一步完成才能继续执行。由于每一步的操作时间响应时间不固定,所以主线程的请求耗时可能会非常长,如果请求过多,会导致IIS站点巨慢,排队请求,甚至宕机,严重影响用户体验。

现在大多数的处理方式如下图

这个做法是主线程只做耗时非常短的入库操作,发送邮件和发送短信,会开启2个异步线程,扔进去并行执行,主线程不管,继续执行后续的操作,这种处理方式要远远好过第一种处理方式,极大的增强了请求响应速度,用户体验良好。缺点是,由于异步线程里的操作都是很耗时间的操作,一个请求要开启2个线程,而一台标准配置的ECS服务器支撑的并发线程数大概在800左右,假设一个线程在10秒做完,这个单个服务器最多能支持400个请求的并发,后面的就要排队。出现这种情况,就要考虑增加服务器做负载,尴尬的增加成本。

消息队列RabbitMq的处理方式

这个流程是,主线程依旧处理耗时低的入库操作,然后把需要处理的消息写进消息队列中,这个写入耗时可以忽略不计,非常快,然后,独立的发邮件子系统,和独立的发短信子系统,同时订阅消息队列,进行单独处理。处理好之后,向队列发送ACK确认,消息队列整条数据删除。这个流程也是现在各大公司都在用的方式,以SOA服务化各个系统,把耗时操作,单独交给独立的业务系统,通过消息队列作为中间件,达到应用解耦的目的,并且消耗的资源很低,单台服务器能承受更大的并发请求。

二.应用解耦

以电商的下订单为例子,假设中间的流程为下单=》减库存=》发货

第一种方式,通过连续操作表,在单一系统中,通过主线程,连续操作。呵呵哒,这种做法,相信很多人刚入门,甚至几年经验了,由于项目小,也在继续使用吧。用户量少,或者都是内部人使用,必然没问题,因为不会在意出的问题,这种做法,只要一个环节出问题,请求直接报错,导致用户懵逼,假设在执行到减库存操作报错了,整个流程没有用事务回滚的话,还会造成数据不一致。

第二种方式,把这三个业务,拆成三个独立系统,通过JSON方式相互调用请求。这个做法,其实已经很不错了,起码独立出来,各自做各自的事情,一定程度上减小了整个系统的耦合性。但是问题是,就算是通过API形式请求,发送请求的系统一般情况下会等待被请求方的响应,如果响应错了,整个程序还是会终止,前面的业务系统假如已经做了入库操作,就必须要混滚了。很麻烦。如果说不等待被请求方响应的话,如果出错,如果还要保证数据一致性,就要做更多的操作,去补全数据,比如,下单成功,减库存失败,发货成功,这样当减库存系统修复后,就要通过订单数据,去补库存表的对应数据。先对麻烦,难处理。

第三种方式,

把消息队列作为中间件,当订单系统下完单后,把数据消息写入消息队列中,库存系统和发货系统同时订阅这个消息队列,思想上和纯API系统调用类似,但是,消息队列RabbitMq本身的强大功能,会帮我们做大量的出错善后处理,还是,假设下单成功,库存失败,发货成功,当我们修复库存的时候,不需要任何管数据的不一致性,因为库存队列未被处理的消息,会直接发送到库存系统,库存系统会进行处理。实现了应用的大幅度解耦。

三.流量削峰

这个主要用在团购,秒杀活动中

这个主要原理就是,控制队列长度,当请求来了,往队列里写入,超过队列的长度,就返回失败,给用户报一个可爱的错误页的等等。

四.日志处理

这个场景应该都很熟悉,一个系统有大量的业务需要各种日志来保证后续的分析工作,而且实时性要求不高,用队列处理再好不过了

五.消息通讯

现在上线的各大社交通讯项目中,实际上是没有用消息队列做即时通讯的,但是它确实可以用来做,有兴趣的不妨去试试吧

这个是点对点通信,消费者A和B同时订阅消息队列,又同时是制造者,就能实现点对点通信

群聊的做法,所有客户端同时订阅队列,又同时是发送,制造者。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

上述大致的5种RabbitMq的应用场景,下面来介绍几个消息队列的区别

ActiveMq:这个应用于JAVA中间件较多

ZeroMq:这个是分发效率最高的队列,是其他队列的十倍以上,缺点是不能数据持久化。

kafka:这是一种高吞吐量的发布订阅消息系统,当每秒达到10W+的分发要求时,可以用这个尝试,新浪微博就是用这个做分发。

先写这么多吧,大致的应用场景,欢迎各路大神来补充,我也是公司需要,学习整理出来的,可能会有理解偏差,见谅哈!

最新文章

  1. MFC双缓存技术代码
  2. Shell编程和Vim操作
  3. [Shell] 文件名截取的问题:bash .vs. csh
  4. Ibatis动态拼装sql,常用标签总结及举栗子。
  5. sqlserver中的循环遍历(普通循环和游标循环)
  6. [转] - hadoop中使用lzo的压缩
  7. 转:LIRe 源代码分析
  8. Springmvc返回JSON乱码问号
  9. js的设计模式
  10. selenium弹窗关闭
  11. viewpager中对fragment的操作
  12. Fast-paced Multiplayer
  13. Tomcat 调优总结
  14. dispatch_async & dispatch_sync
  15. hdu 3646
  16. html网页音乐播放器自带播放列表
  17. POJ 2007 Scrambled Polygon 凸包
  18. html网页中 点击按钮页面跳转
  19. 剑指offer 9.递归和循环 变态跳台阶
  20. 有关导出Excel特殊字符的问题

热门文章

  1. iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
  2. HTML DOM 介绍
  3. 参考bootstrap中的popover.js的css画消息弹框
  4. [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
  5. 满堂红CIO邓劲翔:房屋中介突围
  6. Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)
  7. Android Studio:Failed to resolve ***
  8. iOS中支付宝集成
  9. (转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
  10. (转载)linux下各个文件夹的作用