为什么Facebook在memcached中将TCP用于SET而将UDP用于GET

0xh*_*ker 5 memcached caching key-value

我的问题是关于memcached的。Facebook使用memcached作为其结构化数据的缓存,以减少其用户的延迟。他们在Linux上使用UDP优化了memcached的性能。http://www.facebook.com/note.php?note_id=39391378919

但是有趣的是,他们仍然使用TCP进行设置操作,而使用UDP进行获取操作。

他们为什么要这样做?我的意思是为什么还不使用UDP进行设置操作?由于需要在操作系统中维护减少的状态,因此UDP的伸缩性优于TCP。

谢谢,

ger*_*tas 5

这句话几乎揭示了问题和解决方案:

尽管我们使用 TCP 提高了内存效率,但我们将 get 操作转移到 UDP,以减少网络流量并为多次获取(并行获取数百个键)实现应用程序级流量控制。

TCP 也是流量控制,在 Memcache多获取的情况下,它是非常串行的。您打开连接(或池),查询键列表,等待然后获得所有值列表的结果。相反,他们在无连接并行 UDP获取之上实现了应用程序级流量控制。以下是我在 FB 大小的软件中看到的 UDP 的好处:

  • 无需打开连接、池化它们、进行额外的往返、会话、握手、保持连接等;
  • 可以并行查询多个分布式Memcache服务器和索引,这很好,符合微服务和“微缓存”作为服务的精神;
  • 可以多播 UDP 数据包以提供具有冗余、负载平衡、动态路由甚至分片的高可用性 - 第一个响应获胜!
  • 可以在应用程序级别实施单独的获取超时和重试策略;
  • 只要有任何部分完整的数据可用,就可以执行逻辑 - 无需等待完整的多获取结果;

另一方面,我认为他们确实通过 TCP 写入以保持一致性。带有 memcached 的 TCP 提供了一个事务,在该事务中发送请求,然后响应确认缓存更新。我想在 UDP 中重新实现它不会提供太多好处。


Han*_*nna 0

我认为这是理解丢包的最好方法。例如,当您使用facebook聊天时,如果没有收到一句话您会理解,但在Ymsg中您无法理解这一点。