7

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

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

他们为什么要这样做?我的意思是为什么不使用 UDP 进行设置操作呢?由于减少了操作系统中需要维护的状态,UDP 比 TCP 具有更好的扩展性。

谢谢,

4

3 回答 3

5

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

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

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

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

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

于 2016-12-17T21:23:59.303 回答
2

每个 UDP 数据报包含一个简单的帧头,后面跟着与上述 TCP 协议格式相同的数据。在当前实现中,请求必须包含在单个 UDP 数据报中,但响应可能跨越多个数据报。(跨越多个数据报的唯一常见请求是巨大的多键get请求和set 请求,无论如何出于可靠性原因,这两者都更适合 TCP 传输。)

https://github.com/memcached/memcached/blob/master/doc/protocol.txt

于 2013-04-22T14:56:48.493 回答
0

我认为这是了解数据包丢失的最佳方法。例如,当您使用facebook聊天时,如果没有收到一个句子,您会明白但在Ymsg中您无法理解。

于 2013-04-21T19:56:41.743 回答