zoukankan      html  css  js  c++  java
  • 对于消息队列的理解。

    我们在开发的过程中,会遇到像这样的情况:

      比如,我们需要开发一个给注册用户发送邮件的功能。其实制作起来并不是很难,无非就是两步,

        1、获取需要发送邮件的邮箱,并填写发送内容。

        2、发送。

    这功能实现起来很简单,也很写,对吧!

    那么,现在问题来了。

    我现在有好百万的并发,几百万个用户同时都在注册(当然这里是假设)。这么高并发的情况下,我们还是用同步的方式去执行上面的1和2这两个步骤。

    我可以很负责的告诉大家,一定会出现发送失败的案例,而且会很多。

    那怎么解决这样的问题呢?

    消息队列!!!

    这里我们就引入了消息队列的概念。在理解这个概念之前,我们先来看一个生活中的小例子:

      我们都到餐厅去吃过饭对吧,服务员点单和厨师做菜,一定是服务员点单远远快于厨师做菜。那么问题再一次来了,如果服务员点单和厨师做菜是单线程的同步执行的。

      那么我们作为顾客,一定会有很大的怨言。因为我们要等到上一座点单的是的菜上齐过后才能点餐。

      但是在现实生活中,没有一家餐厅是这样的。通常餐厅中服务员点单和厨师做菜没有直接联系,服务员只管点单,点单成功后记录在一个介质上(这里假设为记录在纸上),然后传递给后厨,后厨再按照单子的前后顺序依次制作。

      其实,我们上面每天都经历的这个情形就是一个典型的消息队列:消息发布者(服务员),将消息存入消息队列(纸质点单记录),消息执行者(厨师)从消息队列取得消息并执行。

    看了上面的例子,我相信绝大部分人对消息队列都应该有了一定的认识了。

    下面为消息队列的一个抽象图。(生产者:服务员、消费者:厨师)

      

    下面,我们来讲一下如何使用消息队列实现百万并发的邮件发送(保证每一封邮件都能发送成功,除非客户填写了一个错误的邮件地址,这里我们不考虑这种情况)

    需要注意的是,存储消息的介质有很多,我们可以根据需求随意选择,不用拘泥于redis的list。这里我们暂且选择mysql作为消息的存储介质。

    我们新建一个表,用于存储消息。表明为MQ,含有三个字段id、u_email(用户邮箱)、post_content(发送内容)。

    1、当用户申请注册的时候,将用户的邮箱和发送内容(发送内容可以视情况而定,这里的逻辑就具体问题具体分析了哈)存入MQ表,存入成功后马上就可以给用户反馈。比如(请到您的邮箱查看邮件是否已发送到您的邮箱......)

    2、用php实现一个定时器,定时从MQ表中取出数据,进行邮件发送。如果成功则从数据表MQ中删除该条记录(当然,一般我们用逻辑删除),如果没有成功,则不删除。

    优点:

    1、后台运行,前台无需等待,马上可以给客户以反应,友好度较高。

    2、成功率高,失败的记录会自动重发,直到成功。

    在工作中会遇到很多刚接触消息队列的程序员,误以为redis的list就是消息队列。其实list只是redis的一种数据类型,它能够实现消息队列功能而已。

    做一个消息队列的总结

      消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
      消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,有消息系统来确保信息的可靠专递,消息发布者只管把消息发布到MQ中而不管谁来取,

      消息使用者只管从MQ中取消息而不管谁发布的,这样发布者和使用者都不用知道对方的存在。

    推荐一个消息队列的中间件,大家有时间可以去了解:RabbitMQ

    希望能够帮到有需要的人。

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/573734817pc/p/10931632.html
Copyright © 2011-2022 走看看