我遇到了一个问题,我有一个 python-memcached 客户端连接到 ElastiCache 上的 3 个 memcached 节点。我有一些具有无限 TTL 的缓存值,并且在更新数据源时它们会被覆盖。缓存也写入缓存未命中。
问题是 memcached 有时会返回旧的缓存值。我对正在发生的事情的最佳猜测是:
- “foo”被写入 memcached A。
- memcached A 在进程 #1 中暂时不可用,因此它被标记为失败。
- 进程#1 使用缓存未命中的 memcached B,因此它将“bar”写入 memcached B 并返回该值。
- 进程#2 能够连接到 memcached A 并且不知道进程#1 将其标记为坏节点,因此它连接并返回“foo”。
- 任何时候进程能够连接到 memcached A “foo”都会返回,但只要它被临时标记为已连接的 memcached B 并返回“bar”。
这是失败导致选择新服务器的行: https ://github.com/linsomniac/python-memcached/blob/release-1.57/memcache.py#L413
我查看了 pymemcached 的散列客户端,我认为它会做同样的事情:暂时删除一个 memcached 主机并尝试使用另一个主机。
当主机将被永久删除时,这是有道理的,但当主机可能只是几秒钟不可用时,这对我来说没有意义。我错过了什么吗?无限 TTL 是 memcached 的反模式吗?