V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
2018yuli
V2EX  ›  程序员

服务边界拆分

  •  
  •   2018yuli · 177 天前 · 1457 次点击
    这是一个创建于 177 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求万能的群友支招:

    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 就不该拆开。

    8 条回复    2023-11-02 10:31:10 +08:00
    pannanxu
        1
    pannanxu  
       177 天前
    Data 自己缓存即可。Manager 直接用过 http 或者 grpc 访问 Data 的接口即可。
    lddsb
        2
    lddsb  
       177 天前
    现在的性能瓶颈是在 DataServer 还是在 ManagerServer ?
    everyx
        3
    everyx  
       177 天前
    直接给 ManagerServer 上 Redis 缓存不行么?量小就单机 Redis ,大了可以组集群。

    ManagerServer 中信息的更新少,访问频次高,那在前面做一层缓存肯定是比较合适的,命中率高,数据更新后让缓存失效再更新就行了。而 DataServer 对于数据的准确性和实时性有要求,在 DataServer 侧做缓存觉得没必要,如果是怕 DataServer 的请求对 ManagerServer 的压力过大吗?横向扩展缓存层就行了。
    xwayway
        4
    xwayway  
       177 天前
    managerServer 用个 redis 缓存,dataServer 做个本地缓存就行了啊,为啥还需要两级缓存呢
    xausky
        5
    xausky  
       177 天前
    谁性能不行就缓存谁 ManagerServer 上缓存,如果上到 DataServer 后面如果加个 OrderServer 也访问这个接口那还慢。
    xwayway
        6
    xwayway  
       177 天前
    @xwayway #4 这么做的目的是,managerServer redis 缓存,既能应对突发的流量冲击,又能保证自己服务吐出的数据的一致性。dataServer 做本地缓存是为了减少对外部服务的频繁调用。
    当然只在 managerServer 做缓存是最简单的,不用管理两次缓存,我觉得缓存一定是优先放在数据提供端,谁提供数据,谁负责缓存,保不准外部服务怎么调用(如果是不同团队在调用这个服务的数据)。
    方案一的缓存通知方案,为了用而用?
    2018yuli
        7
    2018yuli  
    OP
       177 天前
    感谢万能的群友
    2018yuli
        8
    2018yuli  
    OP
       177 天前
    @lddsb 暂时没有性能瓶颈,Mysql 撑得住。单纯想加缓存。Data 端不到 100 QPS ,先去掉 Data 中的 Guava 缓存,改为 Manager 做 Redis 缓存了。后面再改。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1292 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:55 · PVG 07:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.