服务边界拆分

2023-11-02 09:01:22 +08:00
 2018yuli

求万能的群友支招:

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 可配置

ChatGPT 的回答

  1. 方案一:在 DataServer 中做本地缓存,然后 ManagerServer 中修改后异步通知 DataServer 进行变更。

    a. 优点:保持了 DataServer 的独立性,可以实现较高性能的本地缓存,缓存变更可以异步通知,减少对 ManagerServer 的依赖。

    b. 缺点:需要管理缓存一致性,确保通知机制可靠性。

  2. 方案二:在 ManagerServer 中做本地缓存。

    a. 优点:可以更好地控制数据变更和缓存的一致性,减少了 DataServer 的负担。

    b. 缺点:DataServer 的独立性较差,可能影响性能扩展。

  3. 方案三:ManagerServer 缓存给 Redis ,DataServer 做本地缓存和 Redis 两级缓存。

    a. 优点:结合了两级缓存,兼顾了性能和数据一致性,同时减轻了 DataServer 的负担。

    b. 缺点:增加了系统的复杂性和维护成本。

4.方案四:保持现状,并让 Guava 中的缓存可配置。

a. 优点:保持了现有的架构,较少的改动。

b. 缺点:如果需求变化,可能无法满足更高的性能和扩展需求。

综合考虑,我建议您可以考虑方案一或方案三,具体选择取决于您对数据一致性、性能扩展和系统复杂性的权衡。在实施选定方案时,确保进行充分的测试和监控,以确保系统运行稳定。另外,考虑使用缓存框架如 Redis 可以简化缓存的管理和一致性维护。

大家觉得呢?

个人看好方案二啊!或者,是不是服务拆分有误,DataServer 和 ManagerServer 就不该拆开。

1682 次点击
所在节点    程序员
8 条回复
pannanxu
2023-11-02 09:38:31 +08:00
Data 自己缓存即可。Manager 直接用过 http 或者 grpc 访问 Data 的接口即可。
lddsb
2023-11-02 09:40:22 +08:00
现在的性能瓶颈是在 DataServer 还是在 ManagerServer ?
everyx
2023-11-02 09:47:41 +08:00
直接给 ManagerServer 上 Redis 缓存不行么?量小就单机 Redis ,大了可以组集群。

ManagerServer 中信息的更新少,访问频次高,那在前面做一层缓存肯定是比较合适的,命中率高,数据更新后让缓存失效再更新就行了。而 DataServer 对于数据的准确性和实时性有要求,在 DataServer 侧做缓存觉得没必要,如果是怕 DataServer 的请求对 ManagerServer 的压力过大吗?横向扩展缓存层就行了。
xwayway
2023-11-02 09:49:38 +08:00
managerServer 用个 redis 缓存,dataServer 做个本地缓存就行了啊,为啥还需要两级缓存呢
xausky
2023-11-02 09:51:12 +08:00
谁性能不行就缓存谁 ManagerServer 上缓存,如果上到 DataServer 后面如果加个 OrderServer 也访问这个接口那还慢。
xwayway
2023-11-02 10:12:21 +08:00
@xwayway #4 这么做的目的是,managerServer redis 缓存,既能应对突发的流量冲击,又能保证自己服务吐出的数据的一致性。dataServer 做本地缓存是为了减少对外部服务的频繁调用。
当然只在 managerServer 做缓存是最简单的,不用管理两次缓存,我觉得缓存一定是优先放在数据提供端,谁提供数据,谁负责缓存,保不准外部服务怎么调用(如果是不同团队在调用这个服务的数据)。
方案一的缓存通知方案,为了用而用?
2018yuli
2023-11-02 10:24:20 +08:00
感谢万能的群友
2018yuli
2023-11-02 10:31:10 +08:00
@lddsb 暂时没有性能瓶颈,Mysql 撑得住。单纯想加缓存。Data 端不到 100 QPS ,先去掉 Data 中的 Guava 缓存,改为 Manager 做 Redis 缓存了。后面再改。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/987702

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX