我的文章对所有人开放阅读;非会员朋友可以点击这里链接来阅读全文。
我来给你举个简单的例子,大家都能明白的。😯
格蕾丝是汤姆的姐姐哦。
最近,汤姆最近迷上了动画片,而格蕾丝希望他多看看纪录片,因此她常常为汤姆找高质量的纪录片让他看。起初,格蕾丝会这么做,亲自监督他看完再离开。时间一长,他们俩都觉得这种做法不太方便。
从那之后,事情变了:格蕾丝告诉汤姆,“视频架上的所有纪录片都得看完。”从那以后,格蕾丝发现了好的纪录片就放到视频架上,汤姆看到架上有纪录片就拿下来看。
视频存储相当于一个消息队列系统,Grace负责生成消息,而Tom负责消费消息。这样做有以下几个好处:
- 格蕾丝不需要问汤姆他什么时候有空,也不需要亲自把纪录片交给他。她只需把纪录片放上视频架,这给了双方当事人更多的时间自由。
- 格蕾丝相信汤姆的自律和观看能力,不需要监督他的观看过程。她只需把纪录片放上视频架,节省了很多时间,也更加方便。
- 当其他朋友加入时,格蕾丝仍然只需要把纪录片放在视频架上,汤姆和其他人都能从视频架上取走,假设同时有多个人取同一个纪录片,每个人都可以得到一份。
- 纪录片放在视频架上,汤姆可以按照自己的节奏观看。他什么时候看完都没关系。相比格蕾丝亲自递送并监督的做法,汤姆会感到更轻松。
每个成员(Grace 和 Tom)不受其他成员的影响,可以更加独立。他们仅通过一个简单的视频架连接。Grace 可能不知道谁取走了纪录片,Tom 可能不知道谁放上了纪录片。显然,处理一个简单的视频架要比处理一个复杂的人容易得多,让人感觉轻松一百倍。在他们眼里,只有视频架,没有对方的身影。Grace 和 Tom 可以随心所欲地追求自己的喜好。
2.加速:通过决定“将纪录片放到视频架上,不问其他问题”,格蕾丝省了很多时间。尽管格蕾丝很忙,但只需几分钟就能搞定。
3.广播(播音).格雷斯只需要一次努力分享,就能让多个朋友看这部纪录片。这省了她很多时间,也让新朋友加入更方便。
4.减少高峰时段的交通流量如果汤姆慢慢观看纪录片,格蕾丝监督汤姆观看的方式会给汤姆带来压力,也会让格蕾丝感到不耐烦。由于提供纪录片的频率不稳定,这种情况如果在接下来的两天里提供五部连续的纪录片,在接下来的三个月里只提供一部,那么汤姆只需从视频架上取走这五部纪录片,并在接下来的三个月里观看它们,而不需要马上看,这样就大大减少了压力。
使用消息队列当然会有代价:唉 1. 增加的复杂性毫无疑问,‘电视柜’是一件需要放置和防盗的额外物品。
2.暂时的不一致如果妈妈问格蕾丝:“汤姆最近看了哪些纪录片?”用以前的方法,格蕾丝可以自信地告诉妈妈答案,因为她亲自监督汤姆看纪录片。但用新的方式,格蕾丝会心想:“汤姆应该快看完了……”在一段时间里,“妈妈以为汤姆已经看完某部纪录片,但实际上汤姆还没看。”当然,最后汤姆的观看状态会和妈妈的想象一致,这就是所谓的“最终一致性”。
那么,在什么情况下应该使用消息队列呢,你觉得呢?🤔 1.生产者不需要听消费者的意見。在引入消息队列之前,这意味着接口的返回值应该是空的,这导致底层动作尚未完成,而上层认为已完成并继续前进——这就是所谓的异步操作。
Grace把纪录片放好后,就没有去问Tom是否已经看过,她假设他已经看完了,否则她就得用原来的方法监督他看完。
允许暂时的不一致现象。
妈妈可能会发现“有时候会有人说汤姆看过某个纪录片,但实际上他还没有看”。只要妈妈对“反正他最后看过了”感到满意,这样就可以。如果妈妈不能接受这种情况,就会对格蕾丝发脾气,格蕾丝就不敢再使用这种方法了。
3.只有在有效且有益的情况下才使用说到底,解耦、提速、广播、削峰的好处,比放置和监控视频柜的成本更有利。否则,如果盲目跟风购买,“听说杰瑞家买了个视频柜,我们也买一个”,买了却发现没用,反而徒增麻烦,还不如直接把视频资料发给对方。这样做是不对的。也就是说,不要过度设计或浪费资源。
行了,这次就到这里,咱们下次见哈。
最后,如果这篇文章对你有帮助的话,请👏鼓掌并关注我,感谢支持!╰(°▽°)╯
我是Dylan,期待和你一起进步。❤️
推荐阅读哦…
系统设计6个故事
掌控 Redis 和缓存技术这里有18个故事