- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
在Java编程中,使用private关键字修饰了某个成员,只有这个成员所在的类和这个类的方法可以使用,其他的类都无法访问到这个private成员。 上面描述了private修饰符的基本职能,今天来
我是 JWT 的新手,想知道当用户退出应用程序时是否可以在服务器端使 JWT 失效/作废(我也想知道它是否有意义 这样做!)。思路是: 用户点击其应用中的注销链接 应用调用 POST https://
是否有可能使特定操作的 PageCache 无效或删除。 考虑一下: class SiteController extends Controller { public function beh
我使用的是 XCode 9,OSX 而不是 iOS,Objective-C。 我有一个 XPC 服务可以与其他应用程序通信。 XPC 服务对我来说是全新的。我已经阅读了我找到的文档和文章 - 我仍然需
我有一个带有 NSTimer 的 iPhone 应用程序,名为 pressTimer,每当有人触摸此按钮时,该应用程序就会关闭。问题是他们经常触摸按钮,我希望计时器在他们抬起手指时停止。因此,我在 .
session 失效意味着 session 销毁。所以如果 session 被销毁,则表明服务器无法识别之前访问过的客户端。因此现在它为该客户端创建一个新的 session ID。 这是正确的吗?如果
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在尝试缓存 WebClient 返回的 Mono 时遇到问题。代码是这样的: public Mono authenticate() { return cachedTokenMono = ca
我知道通过在 DD-web.xml 文件中设置超时期限来使 session 失效,但我想知道如何以编程方式使 session 失效? 最佳答案 不确定你是否用java编程,但是部署描述符web.xml
我在 2 个不同的服务器上有 2 个应用程序 - Tomcat(基本上是一个 .WAR 文件)和一个在 jBoss 中的 EAR。 EAR 是一个可重复使用的应用程序,我将在其中对用户进行身份验证并将
self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopP
在我的应用程序中,我应该使用多个计时器,但我不想为每个函数添加单独的计时器,我如何创建一个函数来简化创建多个计时器的过程,我尝试了下面的这段代码,它可以工作,但我不能使计时器无效。 import UI
我在 Swift 中做了一个练习项目来学习 NSTimer 是如何工作的。一键启动定时器,一键取消定时器。当我点击每个按钮一次时它工作正常。但是,当我多次点击开始计时器按钮时,我无法再使其无效。 这是
我在清理事件时遇到一个问题。当我从应用程序注销时,我可以执行清理事件以及 session.invalidate()。但是,当我关闭浏览器选项卡或关闭浏览器时,我无法进行干净的事件。我已经为此阅读了很多
我在 7.1.1 的 Google Pixel 设备上进行测试,发现当所有指纹从设备上移除时,我的私钥并未失效。我已经按照演示应用程序使用单个对称 SecretKey 进行了测试并且按预期工作,但是使
我正在 Tomcat 中运行一个 J2EE Web 应用程序,最近我的任务是向该应用程序添加指标。我正在使用 SessionListener 来检测 session 何时被销毁,然后将指标上传到数据库
我通过右键单击项目 -> 应用程序 -> 程序集信息 -> 标题修改了我的 C# 应用程序名称。 如果应用程序已经安装,则它不会更新名称,因为它正在从未刷新的 MUICache 中提取应用程序名称。
我正在使用 AssetsLibrary 框架将 Assets 保存到特定相册 (ALAssetsGroup)。 由于我经常使用 ALAssetsGroup(用于我想保存 Assets 的专辑),我认为
我的应用程序中有 4 个 NSTimers 对象,它们每隔几秒就会向一个 rest URL 发出请求。 点击一个特定的按钮我想停止计时器,这样它就停止轮询,点击另一个按钮我想恢复轮询。 我已经为所有计
我正在开发一个使用 JWT token 身份验证的 API。我在其背后创建了一些逻辑来使用验证码等更改用户密码。 一切正常,密码已更改。但这里有一个问题:即使用户密码已更改并且我在验证时获得了新的 J
我是一名优秀的程序员,十分优秀!