<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mq on </title>
    <link>https://note.lican.site/tags/mq/</link>
    <description>Recent content in Mq on </description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© lican.asia All rights reserved</copyright>
    <lastBuildDate>Fri, 31 Dec 2021 12:54:50 +0800</lastBuildDate>
    <atom:link href="https://note.lican.site/tags/mq/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>《漫谈 MQ》要消息队列（MQ）有什么用？</title>
      <link>https://note.lican.site/posts/posts/why-mq/</link>
      <pubDate>Fri, 31 Dec 2021 12:54:50 +0800</pubDate>
      <guid>https://note.lican.site/posts/posts/why-mq/</guid>
      <description>&lt;p&gt;大家好，我是煎鱼。想是问题，做是答案。&lt;/p&gt;&#xA;&lt;p&gt;最近我有一个朋友公司踩了不少消息队列（MQ）的坑，让人无奈不已。因此计划写 MQ 系列的技术文章，来科普更多这块的知识。&lt;/p&gt;&#xA;&lt;p&gt;目前 MQ 也是互联网应用中非常常用的基础组件了，面试特爱问。基本有一定规模的系统都能看见他的踪影。&lt;/p&gt;&#xA;&lt;p&gt;无论是 RocketMQ、Kafka、RabbitMQ 等，都围绕着根本的设计出发产生不同的高级功能，甚至可能是雷同的设计有 N 个名字。&lt;/p&gt;&#xA;&lt;h2 id=&#34;什么是-mq&#34;&gt;什么是 MQ&lt;/h2&gt;&#xA;&lt;p&gt;MQ 一般代指消息队列（Message Queue）。它是一个抽象层，允许多个进程（可能在不同的机器上）通过各种模式（例如：点对点，发布订阅等）进行通信。&lt;/p&gt;&#xA;&lt;p&gt;也可以根据不同的实现，它可以被配置为保证可靠性、错误报告、安全、发现、性能等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;为什么需要-mq&#34;&gt;为什么需要 MQ&lt;/h2&gt;&#xA;&lt;p&gt;在当下 MQ 的必要场景，比较经典的说辞就是 “异步、削峰、解耦”。是各类秒杀系统的设计核心，甚至会作为不少云厂商的卖点，每家都有自己的生态圈。&lt;/p&gt;&#xA;&lt;p&gt;核心分为三个要点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;解耦。&lt;/li&gt;&#xA;&lt;li&gt;削峰。&lt;/li&gt;&#xA;&lt;li&gt;异步。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;解耦&#34;&gt;解耦&lt;/h3&gt;&#xA;&lt;p&gt;在业务系统设计中，我们常常会与一个平台系统 A，他汇聚了许许多多的系统的对接。例如，系统 A 作为平台拥有大量用户操作，自然就有非常多的用户行为。&lt;/p&gt;&#xA;&lt;p&gt;虽然他自己可能不大需要，但是其他子系统就不同了，会要系统 A 来调用他们提供的接口，传输各种行为数据。&lt;/p&gt;&#xA;&lt;p&gt;其链路依赖如下图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/84478d2799861f81519ede0ba4ceb91d.jpg&#34; alt=&#34;多重依赖&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这时候作为平台方的系统 A 就烦死了，来一个要对接一个，就得安排一个人排工期和迭代。对方还有可能出现系统不稳定，还得关注他们的稳定性和诉求。&lt;/p&gt;&#xA;&lt;p&gt;但用了 MQ 后就不一样了，如下图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/b6c79dbe5c848ed32e347de4042cd9b6.jpg&#34; alt=&#34;MQ 解耦直接依赖&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;系统 A 只需要将消息放到 MQ 中去，不管以后是对接系统 B、C、D、E&amp;hellip;，他都不需要太关心，不用一个个对接。用业务同学的话来讲，就是：“自己看文档，去 MQ 里拿，别来骚扰我”。&lt;/p&gt;&#xA;&lt;p&gt;以此 MQ 达到了系统间解耦的目的。&lt;/p&gt;&#xA;&lt;h3 id=&#34;削峰&#34;&gt;削峰&lt;/h3&gt;&#xA;&lt;p&gt;在 2C 类别的业务系统中，常常会有活动的概念，要面向用户做促销，像我们常见的双 11、618 都是这类营销，也是营销场景。&lt;/p&gt;&#xA;&lt;p&gt;但这种场景之下，会对系统产生较大的冲击。类似八二原则，也就是 80% 的流量集中在某个时间冲击进来，形成了流量尖峰（高 QPS），系统会因为承受不了如此大的压力，从而宕机。&lt;/p&gt;&#xA;&lt;p&gt;如下图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/e396606bb1aec70b43a7016933880f09.jpg&#34; alt=&#34;用户直接并发访问&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;用户的请求会经由系统 A 直击数据库。当然，在活动场景下的大流量，数据库自然也就撑不住了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>《漫谈 MQ》设计 MQ 的 3 个难点</title>
      <link>https://note.lican.site/posts/posts/mq-nodus/</link>
      <pubDate>Fri, 31 Dec 2021 12:54:50 +0800</pubDate>
      <guid>https://note.lican.site/posts/posts/mq-nodus/</guid>
      <description>&lt;p&gt;大家好，我是煎鱼。&lt;/p&gt;&#xA;&lt;p&gt;前段时间我们分享了漫谈 MQ 的第一期《要消息队列（MQ）有什么用？》，感觉打开了一个新的世界。&lt;/p&gt;&#xA;&lt;p&gt;但很快就有小伙伴意识到了不妙，既然 MQ 承接了多个系统，那岂不是该有的问题，他都有，又或是更甚。如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://files.mdnice.com/user/3610/45b00332-9a06-49b6-a666-675890409c94.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;今天我们就进一步讲讲，&lt;strong&gt;设计 MQ 时很有可能会遇到的几个大难点&lt;/strong&gt;，在业内又配套用了什么解决方案去处理。&lt;/p&gt;&#xA;&lt;h2 id=&#34;几个难点&#34;&gt;几个难点&lt;/h2&gt;&#xA;&lt;p&gt;从结论上来看，设计 MQ 这一个存在。会至少引发三大难点。堪称互联网经典的，也是面试官们最爱问的：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;高可用：代表系统的可用性程度，高可用性通常通过提高系统的容错能力来实现，从而减少系统宕机时间。&lt;/li&gt;&#xA;&lt;li&gt;高并发：代表通过设计保证系统能够同时并行处理很多请求，在同一个时间点，有很多用户同时访问同一系统、API、URL。&lt;/li&gt;&#xA;&lt;li&gt;高可靠：代表能够满足预计条件的一个系统或组件（例如：备份、故障处理、数据存储以及访问），比较经典的是 4 个9 等标准。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;高可用&#34;&gt;高可用&lt;/h3&gt;&#xA;&lt;p&gt;像前面评论区留言的兄弟截图表述的一样。&lt;/p&gt;&#xA;&lt;p&gt;虽然请求不直接找系统 A、B、C、D 了。但是请求都实打实的通过异步的方式打到了 MQ 上，就可以不断往 MQ 塞，变成了多个系统都在请求 MQ，可以认为压力比单系统同步调用大了不止一倍。&lt;/p&gt;&#xA;&lt;p&gt;同时 MQ 还要去做消费关系的维护，存储既有和新增的大量消息。是一个既要也要还要的典型场景。&lt;/p&gt;&#xA;&lt;p&gt;这样一来，新的一轮问题就出现了。就是要保证 MQ 的高可用，否则他轻轻松松就会被压到宕机，或是负载过高，出现一些匪夷所思的延迟。&lt;/p&gt;&#xA;&lt;p&gt;如何保证 MQ 的高可用，是一个大问题。&lt;/p&gt;&#xA;&lt;h3 id=&#34;高并发&#34;&gt;高并发&lt;/h3&gt;&#xA;&lt;p&gt;在高并发上的诉求上，其实是和高可用的场景是一样的。既然各业务系统都是异步的了，自然他也就不会像同步阻塞一样 “等” 你。&lt;/p&gt;&#xA;&lt;p&gt;像是我有一个朋友，他们喜欢批量清洗多租户的数据。业务程序也不怎么节制，几十、几百、上千万数据，利用 Go 语言写的，抄起 for-loop+go func 就是一把梭。刷刷刷一下子就就给打进 MQ 里。&lt;/p&gt;&#xA;&lt;p&gt;再多来几个业务系统这么干，这 MQ 并发就比较高了，单单维护就是头疼。很有可能事故背着背着，年底就 3.25 了。因为 MQ，在业务中的依赖非常重，是标准的核心基础设施。&lt;/p&gt;&#xA;&lt;p&gt;如何保证 MQ 能够承受高并发，是一个大问题。&lt;/p&gt;&#xA;&lt;h3 id=&#34;高可靠&#34;&gt;高可靠&lt;/h3&gt;&#xA;&lt;p&gt;对 MQ 来讲，高可靠性的诉求，又分为好几个角度去理解。如下：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;消息要靠谱：“我” 发的消息要能够可靠的到达 MQ，MQ 要能够正确的让消费者能够接收到推送或拉取。&lt;/li&gt;&#xA;&lt;li&gt;存储要靠谱：“我” 发的消息，还在 MQ 上时要存储好，不能发到 MQ 上就因为大量数据，丢了。又或是查询很慢。&lt;/li&gt;&#xA;&lt;li&gt;处理要靠谱：发了消息，可能会出现异常。发了消息，可能网络抖动，没有接收到。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;上述我们列了三点 “要靠谱” 的内容。实质上，对于 MQ 来讲，其每一块领域都要保证其可靠性，否则查起问题来，真的是会非常崩溃。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
