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

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

  • 相关阅读:
    本地http://localhost打不开怎么办
    C#中lock死锁实例教程
    结对-四则运算答题器-项目进度
    Forward团队-爬虫豆瓣top250项目-代码设计规范
    Forward团队-爬虫豆瓣top250项目-设计文档
    学习使用github
    Forward团队-爬虫豆瓣top250项目-团队编程项目开发环境搭建过程
    课后作业-阅读任务-阅读提问-1
    20170915-构建之法:现代软件工程-阅读笔记
    结对-四则运算答题器-设计文档
  • 原文地址:https://www.cnblogs.com/573734817pc/p/10931632.html
Copyright © 2011-2022 走看看