Skip to content

Commit

Permalink
Add association
Browse files Browse the repository at this point in the history
  • Loading branch information
yanglbme committed Oct 7, 2018
1 parent a5e83c4 commit 4847fab
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
如何保证消息队列的高可用?

## 面试官心理分析
如果有人问到你 MQ 的知识,**高可用是必问的**上一讲提到,MQ 会导致**系统可用性降低**。所以只要你用了 MQ,接下来问的一些要点肯定就是围绕着 MQ 的那些缺点怎么来解决了。
如果有人问到你 MQ 的知识,**高可用是必问的**[上一讲](/docs/high-concurrency/why-mq.md)提到,MQ 会导致**系统可用性降低**。所以只要你用了 MQ,接下来问的一些要点肯定就是围绕着 MQ 的那些缺点怎么来解决了。

要是你傻乎乎的就干用了一个 MQ,各种问题从来没考虑过,那你就杯具了,面试官对你的印象就是,只会简单使用一些技术,没任何思考,马上对你的印象就不太好了。这样的同学招进来要是做个 20k 薪资以内的普通小弟还凑合,要是做薪资 20k+ 的高工,那就惨了,让你设计个系统,里面肯定一堆坑,出了事故公司受损失,团队一起背锅。

Expand Down Expand Up @@ -30,7 +30,7 @@ RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模

所以这个事儿就比较尴尬了,这就**没有什么所谓的高可用性****这方案主要是提高吞吐量的**,就是说让集群中多个节点来服务某个 queue 的读写操作。

#### 镜像集群模式(高可用性)
#### 镜像集群模式高可用性
这种模式,才是所谓的 RabbitMQ 的高可用模式,跟普通集群模式不一样的是,你创建的 queue,无论元数据还是 queue 里的消息都会**存在于多个实例上**,然后每次你写消息到 queue 的时候,都会自动把**消息同步**到多个实例的 queue 上。

![mq-8](http://p9ucdlghd.bkt.clouddn.com/mq-8.png)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一个 offset,代表消息的序号,然后 consumer 消费了数据之后,**每隔一段时间**(定时定期),会把自己消费过的消息的 offset 提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的 offset 来继续消费吧”。

但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启了,如果碰到点着急的,直接 kill 进程了,再重启。这会导致consumer 有些消息处理了,但是没来得及提交 offset,尴尬了。重启之后,少数消息会再次消费一次。
但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启了,如果碰到点着急的,直接 kill 进程了,再重启。这会导致 consumer 有些消息处理了,但是没来得及提交 offset,尴尬了。重启之后,少数消息会再次消费一次。

![mq-10](http://p9ucdlghd.bkt.clouddn.com/mq-10.png)

Expand Down
4 changes: 2 additions & 2 deletions docs/high-concurrency/why-mq.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,10 @@
缺点有以下几个:

- 系统可用性降低<br>
系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整,MQ 一挂,整套系统崩溃的,你不就完了?如何保证消息队列的高可用,可以[点击这里查看](/high-concurrency/how-to-ensure-high-availability-of-message-queues.md)
系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整,MQ 一挂,整套系统崩溃的,你不就完了?如何保证消息队列的高可用,可以[点击这里查看](/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md)

- 系统复杂度提高<br>
硬生生加个 MQ 进来,你怎么[保证消息没有重复消费](/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md)?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。
硬生生加个 MQ 进来,你怎么[保证消息没有重复消费](/docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md)?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。

- 一致性问题<br>
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
Expand Down

0 comments on commit 4847fab

Please sign in to comment.