面试套路 - 消息队列
为什么要用MQ
- 消息中间件把进程间通信和网络通信的底层细节屏蔽,提供统一的接口。
- 自动解决包拼接的问题,tcp是基于单字节的流传输协议,你需要自己做包的encode和parser,并且parser是针对字节流。消息中间件一般提供基于消息粒度的接口。
- 消息中间件提供了一些常用的消息通信模式,例如:发布-订阅模式,广播模式等。这是一个理由。自己写的话,也需要做这些事情,细节还多。通信模式一般伴随着一套协议,例如AMQP协议。
- 消息中间件可能会提供持久化的能力,如果你的程序处理不过来,它会在中间提供队列的能力,队列还有一定的持久化策略支持。这提高了系统的可用性和吞吐能力。这个角度上它有点像电容的作用。
- 消息中间件提供一个消息的多种传输模式,例如:保证一个包只会被发一次,或者一个包可以发多次等等策略。
- 以上这些能力,让你在选择用一台机子多进程(单机多个子服务),或者多台机子多进程(多机多服务),搭建这样的构架的时候,不用解决tcp这层传输到应用层上述需求之间的那些提供可靠有策略传输的实现细节。
- 各种不同的消息中间件的区别在于实现语言、功能侧重、对IO/存储支持上的各不相同。理解清楚为什么要使用消息中间件,就像我们必须理解为什么要用tcp而不用udp一样。
Kakafa为什么性能很高
Page Cache
Page Cache是OS的一种磁盘缓存机制,目的是减少对磁盘的IO操作。具体来说就是把磁盘中的数据缓存在内存中,把对磁盘的访问变成对内存的访问
Zero Copy
如图所示,传统跨进程的文件读写涉及到4次拷贝(上下文切换),kafka采用sendfile系统调用后简化了不必要的拷贝:
数据表明采用了零拷贝之后提高60%的发送性能
kafka怎么保证消息可靠性?可以通过配置ack保证不同的可靠性投递,但是依然不能保证100%可靠性投递,因为网络太差的话ack还是回不来。
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雨碎江南!