DataServer 需要 访问 ManagerServer 的设备基础信息,设备型号信息,且访问频率比较频繁(突发性 6 次查询每 10 秒)。但基本(设备和型号 信息)不会做太多的变更
1. 考虑保持 DataServer 的独立性,使其运行不依赖 ManagerServer
2. 考虑一定的性能扩展空间
3. 目前是使用 guava 在 DataServer 中做了一层 cache ,缓存 5 分钟
1. 方案一:考虑在 DataServer 中做一个本地缓存?然后 ManagerServer 中修改后异步通知 DataServer 进行变更。
2. 方案二:在 ManagerServer 中做本地缓存
3. 方案三:ManagerServer 缓存给 Reids ,DataServer 做本地缓存和 Redis 两级缓存
4. 方案四:保持现状,并让 guava 中的 cache 可配置
方案一:在 DataServer 中做本地缓存,然后 ManagerServer 中修改后异步通知 DataServer 进行变更。
a. 优点:保持了 DataServer 的独立性,可以实现较高性能的本地缓存,缓存变更可以异步通知,减少对 ManagerServer 的依赖。
b. 缺点:需要管理缓存一致性,确保通知机制可靠性。
方案二:在 ManagerServer 中做本地缓存。
a. 优点:可以更好地控制数据变更和缓存的一致性,减少了 DataServer 的负担。
b. 缺点:DataServer 的独立性较差,可能影响性能扩展。
方案三:ManagerServer 缓存给 Redis ,DataServer 做本地缓存和 Redis 两级缓存。
a. 优点:结合了两级缓存,兼顾了性能和数据一致性,同时减轻了 DataServer 的负担。
b. 缺点:增加了系统的复杂性和维护成本。
4.方案四:保持现状,并让 Guava 中的缓存可配置。
a. 优点:保持了现有的架构,较少的改动。
b. 缺点:如果需求变化,可能无法满足更高的性能和扩展需求。
综合考虑,我建议您可以考虑方案一或方案三,具体选择取决于您对数据一致性、性能扩展和系统复杂性的权衡。在实施选定方案时,确保进行充分的测试和监控,以确保系统运行稳定。另外,考虑使用缓存框架如 Redis 可以简化缓存的管理和一致性维护。
个人看好方案二啊!或者,是不是服务拆分有误,DataServer 和 ManagerServer 就不该拆开。
1
pannanxu 2023-11-02 09:38:31 +08:00
Data 自己缓存即可。Manager 直接用过 http 或者 grpc 访问 Data 的接口即可。
|
2
lddsb 2023-11-02 09:40:22 +08:00
现在的性能瓶颈是在 DataServer 还是在 ManagerServer ?
|
3
everyx 2023-11-02 09:47:41 +08:00
直接给 ManagerServer 上 Redis 缓存不行么?量小就单机 Redis ,大了可以组集群。
ManagerServer 中信息的更新少,访问频次高,那在前面做一层缓存肯定是比较合适的,命中率高,数据更新后让缓存失效再更新就行了。而 DataServer 对于数据的准确性和实时性有要求,在 DataServer 侧做缓存觉得没必要,如果是怕 DataServer 的请求对 ManagerServer 的压力过大吗?横向扩展缓存层就行了。 |
4
xwayway 2023-11-02 09:49:38 +08:00
managerServer 用个 redis 缓存,dataServer 做个本地缓存就行了啊,为啥还需要两级缓存呢
|
5
xausky 2023-11-02 09:51:12 +08:00
谁性能不行就缓存谁 ManagerServer 上缓存,如果上到 DataServer 后面如果加个 OrderServer 也访问这个接口那还慢。
|
6
xwayway 2023-11-02 10:12:21 +08:00
@xwayway #4 这么做的目的是,managerServer redis 缓存,既能应对突发的流量冲击,又能保证自己服务吐出的数据的一致性。dataServer 做本地缓存是为了减少对外部服务的频繁调用。
当然只在 managerServer 做缓存是最简单的,不用管理两次缓存,我觉得缓存一定是优先放在数据提供端,谁提供数据,谁负责缓存,保不准外部服务怎么调用(如果是不同团队在调用这个服务的数据)。 方案一的缓存通知方案,为了用而用? |
7
2018yuli OP 感谢万能的群友
|