小机灵鬼|42 张图带你揭秘后端技术都要学啥?( 三 )


此时假设两个系统分别为A,B , 其中A系统依赖B系统 , 两者通信采用远程调用的方式 , 此时如果B系统出故障 , 很可能引起A系统出故障 。
从而不得不单独进行升级 , 怎么办?
使用消息队列的异步架构 , 也成为事件驱动模型 。
异步相对于同步而言 , 同步通常是当应用程序调用服务的时候 , 不得不阻塞等待服务期完成 , 此时CPU空闲比较浪费 , 直到返回服务结果后才会继续执行 。
小机灵鬼|42 张图带你揭秘后端技术都要学啥?同步
举个例子 , 小蓝今天想在系统中加一个发邮件的功能 , 通过SMTP和远程服务器通信 , 但是远程服务器有很多邮件需要等待发送呢 , 当前邮件就可能等待比较长时间才能发送成功 , 发送成功后反馈与应用程序 。
这个过程中 , 远程服务器发送邮件的时候 , 应用程序就阻塞 , 准确的说是执行应用程序的线程阻塞 。
这样阻塞带来什么问题“?

  • 不能释放占用的系统资源 , 导致系统资源不足 , 影响系统性能
  • 无法快速给用户响应结果
但是在实际情况中 , 我们发送邮件 , 并不需要得到发送结果 。 比如用户注册 , 发送账号激活邮件 , 无论邮件是否发送成功都会收到"返回邮件已经发送 , 请查收邮件确认激活" , 怎样才能让应用程序不阻塞?
小机灵鬼|42 张图带你揭秘后端技术都要学啥?消息队列的异步模型
此时就比较清晰了 , 调用者将消息发送给消息队列直接返回 , 应用程序收到返回以后继续执行 , 快读响应用户释放资源 。
有专门的消费队列程序从中消息队列取出数据并进行消费 。 如果远程服务出现故障 , 只会传递给消费者程序而不会影响到应用程序 。
小机灵鬼|42 张图带你揭秘后端技术都要学啥?消息队列
消息队列模型中通常有三个角色 , 分别为生产者 , 消息队列和消费者 。 生产者产生数据封装为消息发送给消息队列 , 专门的消费程序从消息队列中取出数据 , 消费数据 。
在我看来 , 消息队列主要是缓冲消息 , 等待消费者消费 。 其中消费的方式分为两种:
  • 点对点
对生产者多消费者的情况 。 一个消息被一个消费者消费
小机灵鬼|42 张图带你揭秘后端技术都要学啥?多生产消费
上述的发邮件例子就是典型的点对点模式 。 互不干扰 , 其中某个服务出现问题不会印象到全局 。
  • 订阅模式
开发人员在消息队列中设置主题 , 生产者往相应的主题发送数据 , 消费者从对应的主题中消费数据 , 每个消费者按照自己业务逻辑分别进行计算
小机灵鬼|42 张图带你揭秘后端技术都要学啥?订阅模式
这个比较好理解 , 比如在用户注册的时候 , 我们将注册信息放入主题用户中 , 消费者订阅了这个主题 , 可能有构造短信消息的消费者 , 也有推广产品的消费者 , 都可以根据自己业务逻辑进行数据处理 。
小机灵鬼|42 张图带你揭秘后端技术都要学啥?用户注册案例


推荐阅读