10
10
11
11
- ** 第一** ,你知不知道你们系统里为什么要用消息队列这个东西?
12
12
13
- 不少候选人,说自己项目里用了 Redis、MQ,但是其实他并不知道自己为什么要用这个东西。其实说白了,就是为了用而用,或者是别人设计的架构,他从头到尾都没思考过。
14
-
15
- 没有对自己的架构问过为什么的人,一定是平时没有思考的人,面试官对这类候选人印象通常很不好。因为面试官担心你进了团队之后只会木头木脑的干呆活儿,不会自己思考。
13
+ 不少候选人,说自己项目里用了 Redis、MQ,但是其实他并不知道自己为什么要用这个东西。其实说白了,就是为了用而用,或者是别人设计的架构,他从头到尾都没思考过。
14
+
15
+ 没有对自己的架构问过为什么的人,一定是平时没有思考的人,面试官对这类候选人印象通常很不好。因为面试官担心你进了团队之后只会木头木脑的干呆活儿,不会自己思考。
16
16
17
17
- ** 第二** ,你既然用了消息队列这个东西,你知不知道用了有什么好处&坏处?
18
18
19
- 你要是没考虑过这个,那你盲目弄个 MQ 进系统里,后面出了问题你是不是就自己溜了给公司留坑?你要是没考虑过引入一个技术可能存在的弊端和风险,面试官把这类候选人招进来了,基本可能就是挖坑型选手。就怕你干 1 年挖一堆坑,自己跳槽了,给公司留下无穷后患。
19
+ 你要是没考虑过这个,那你盲目弄个 MQ 进系统里,后面出了问题你是不是就自己溜了给公司留坑?你要是没考虑过引入一个技术可能存在的弊端和风险,面试官把这类候选人招进来了,基本可能就是挖坑型选手。就怕你干 1 年挖一堆坑,自己跳槽了,给公司留下无穷后患。
20
20
21
21
- ** 第三** ,既然你用了 MQ,可能是某一种 MQ,那么你当时做没做过调研?
22
22
23
- 你别傻乎乎的自己拍脑袋看个人喜好就瞎用了一个 MQ,比如 Kafka,甚至都从没调研过业界流行的 MQ 到底有哪几种。每一个 MQ 的优点和缺点是什么。每一个 MQ ** 没有绝对的好坏** ,但是就是看用在哪个场景可以** 扬长避短,利用其优势,规避其劣势** 。
23
+ 你别傻乎乎的自己拍脑袋看个人喜好就瞎用了一个 MQ,比如 Kafka,甚至都从没调研过业界流行的 MQ 到底有哪几种。每一个 MQ 的优点和缺点是什么。每一个 MQ ** 没有绝对的好坏** ,但是就是看用在哪个场景可以** 扬长避短,利用其优势,规避其劣势** 。
24
24
25
- 如果是一个不考虑技术选型的候选人招进了团队,leader 交给他一个任务,去设计个什么系统,他在里面用一些技术,可能都没考虑过选型,最后选的技术可能并不一定合适,一样是留坑。
25
+ 如果是一个不考虑技术选型的候选人招进了团队,leader 交给他一个任务,去设计个什么系统,他在里面用一些技术,可能都没考虑过选型,最后选的技术可能并不一定合适,一样是留坑。
26
26
27
27
## 面试题剖析
28
28
84
84
85
85
缺点有以下几个:
86
86
87
- - 系统可用性降低< br >
87
+ - 系统可用性降低
88
88
89
- 系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,ABCD 四个系统还好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ 一挂,整套系统崩溃,你不就完了?如何保证消息队列的高可用,可以[ 点击这里查看] ( /docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md ) 。
89
+ 系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,ABCD 四个系统还好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ 一挂,整套系统崩溃,你不就完了?如何保证消息队列的高可用,可以[ 点击这里查看] ( /docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md ) 。
90
90
91
- - 系统复杂度提高< br >
91
+ - 系统复杂度提高
92
92
93
- 硬生生加个 MQ 进来,你怎么[ 保证消息没有重复消费] ( /docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md ) ?怎么[ 处理消息丢失的情况] ( /docs/high-concurrency/how-to-ensure-the-reliable-transmission-of-messages.md ) ?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。
93
+ 硬生生加个 MQ 进来,你怎么[ 保证消息没有重复消费] ( /docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md ) ?怎么[ 处理消息丢失的情况] ( /docs/high-concurrency/how-to-ensure-the-reliable-transmission-of-messages.md ) ?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。
94
94
95
- - 一致性问题< br >
95
+ - 一致性问题
96
96
97
- A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
97
+ A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
98
98
99
- 所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,做好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了 10 倍。但是关键时刻,用,还是得用的。
99
+ 所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,做好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了 10 倍。但是关键时刻,用,还是得用的。
100
100
101
101
### Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
102
102
@@ -111,9 +111,9 @@ A 系统处理完了直接返回成功了,人都以为你这个请求就成功
111
111
112
112
综上,各种对比之后,有如下建议:
113
113
114
- 一般的业务系统要引入 MQ,最早大家都用 ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人不推荐用这个了;
114
+ 一般的业务系统要引入 MQ,最早大家都用 ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人不推荐用这个了。
115
115
116
- 后来大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是确实人家是开源的,比较稳定的支持,活跃度也高;
116
+ 后来大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是确实人家是开源的,比较稳定的支持,活跃度也高。
117
117
118
118
不过现在确实越来越多的公司会去用 RocketMQ,确实很不错,毕竟是阿里出品,但社区可能有突然黄掉的风险(目前 RocketMQ 已捐给 [ Apache] ( https://github.com/apache/rocketmq ) ,但 GitHub 上的活跃度其实不算高)对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用 RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。
119
119
0 commit comments