gpt4 book ai didi

web-services - 使用 RabbitMQ 使本地内存缓存失效的陷阱

转载 作者:行者123 更新时间:2023-12-04 01:08:23 24 4
gpt4 key购买 nike

我有一个 Java Web 服务器,目前正在使用 Guava 库来处理我大量使用的内存缓存。我现在需要扩展到多台服务器 (2+) 以进行故障转移和负载平衡。在这个过程中,我从进程内缓存切换到了 Memcache(外部服务)。但是,我对结果并不十分满意,因为现在几乎每次调用时,我都必须对另一台服务器进行外部调用,这比内存缓存慢得多。

我在想,与其从 Memcache 获取数据,不如继续在每个服务器上使用本地缓存,并在需要更新缓存时使用 RabbitMQ 通知其他服务器。因此,如果一台服务器对底层数据进行了更改,它还会向所有其他服务器广播一条消息,告诉它们它们的缓存现在无效。每个服务器都在广播和监听缓存失效消息。

有谁知道这种方法的任何潜在缺陷?我有点紧张,因为我找不到其他人在生产中这样做。我看到的唯一问题是每个服务器都需要更多内存(内存缓存),并且任何给定的服务器获取更新数据可能需要更长的时间。还要别的吗?

最佳答案

我在这里对你的问题有点困惑,所以我将以一种对我有意义的方式重申,然后回答我对你的问题的版本。如果我不符合您的想法,请随时发表评论。
您有一个使用进程本地内存缓存来存储数据的 Web 应用程序。您希望扩展到多个节点并为您的程序保持相同的结构,而不是依赖具有内置缓存复制的第 3 方工具(memcached、Couchbase、Redis)。因此,您正在考虑使用 RabbitMQ 将更改发布到各个节点,以便他们可以相应地更新本地缓存。
我最初的 react 是,最好通过使用上述工具之一来完成您想要做的事情。除了涉及明显的开发和严格的测试之外,Couchbase、Memcached 和 Redis 都旨在解决您遇到的问题。
此外,理论上,当您进行水平扩展时,您的应用程序节点中的可用内存会耗尽,然后您将真的一团糟。一旦您达到此限制使您的应用程序不可行的地步,无论如何您最终都会使用其中一种工具,此时您设计自定义解决方案的所有辛勤工作都将付之东流。
我能想到的唯一异常(exception)是如果您的应用程序是大量计算密集型的并且不使用太多内存。在这种情况下,我认为基于 RabbitMQ 的解决方案很简单,但是如果 RMQ 中的消息丢失,您有时需要某种程序来同步服务器之间的缓存。您还需要一种处理节点启动和关闭的方法。
编辑
考虑到您在评论中看到的访问时间为数百毫秒,我建议您首先检查您的设置。从 Memcached(或 Couchbase,或 Redis 等)实例读取缓存中的单个项目的典型读取时间为亚毫秒(如果我没记错的话,大约在 0.1 毫秒左右),因此缓存服务器的“问题 child ”就性能而言,与它应该达到的水平相差几个数量级。从那里开始,然后看看你是否还有同样的问题。

关于web-services - 使用 RabbitMQ 使本地内存缓存失效的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21098502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com