服务之间通过缓存传递数据,我坚决反对!

数据的移动,需要载体,DB和cache是常见的数据存储载体。

服务之间通过缓存传递数据,我坚决反对!
如上图:
(1)service-A将数据放入cache;
(2)service-B从cache里读取数据;
cache作为数据存储载体的好处是:
(1)cache的读取和写入都非常快;
(2)service-A和service-B物理上解耦
那么问题来了:
(1)你遇到过这种“服务之间通过缓存传递数据”的架构设计么?
(2)这种架构设计好还是不好,为什么?
 
关于这种架构设计方案,分享下个人的观点。
 
楼主支持这种架构设计么?
先说结论,楼主旗帜鲜明的反对“服务之间通过缓存传递数据”。
 
为什么反对呢?
核心理由有3点。
第一点:数据管道场景,MQ比cache更加适合。
 
如果只是单纯的将cache作为两个服务数据通讯的管道,service-A生产数据,service-B(当然,可能有service-C/service-D等)订阅数据,MQ比cache更加合适:
(1)MQ是互联网常见的逻辑解耦,物理解耦组件,支持1对1,1对多各种模式,非常成熟的数据通道;
(2)而cache反而会将service-A/B/C/D耦合在一起,大家要彼此协同约定key的格式,ip地址等;
(3)MQ能够支持push,而cache只能拉取,不实时,有时延;
(4)MQ天然支持集群,支持高可用,而cache未必;
(5)MQ能支持数据落地,cache具备将数据存在内存里,具有“易失”性,当然,有些cache支持落地,但互联网技术选型的原则是,让专业的软件干专业的事情:nginx做反向代理,db做固化,cache做缓存,mq做通道;
服务之间通过缓存传递数据,我坚决反对!
综上,数据管道场景,MQ比cache更加适合
 
第二点:数据共管场景,两个(多个)service同时读写一个cache实例会导致耦合。
 
服务之间通过缓存传递数据,我坚决反对!
如果不是数据管道,是两个(多个)service对一个cache进行数据共管,同时读写,也是不推荐的,这些service会因为这个cache耦合在一起:
(1)大家要彼此协同约定key的格式,ip地址等,耦合;
(2)约定好同一个key,可能会产生数据覆盖,导致数据不一致;
(3)不同服务业务模式,数据量,并发量不一样,会因为一个cache相互影响,例如service-A数据量大,占用了cache的绝大部分内存,会导致service-B的热数据全部被挤出cache,导致cache失效;又例如service-A并发量高,占用了cache的绝大部分连接,会导致service-B拿不到cache的连接,从而服务异常;
服务之间通过缓存传递数据,我坚决反对!
综上,数据共管场景,多个service耦合在一个cache实例里,也是不推荐的,需要垂直拆分,实例解耦
 
第三点:数据访问场景,两个(多个)service有读写一份数据的需求。
 
服务之间通过缓存传递数据,我坚决反对!
根据服务化的原则,数据是私有的(本质也是解耦):
(1)service层会向数据的需求方屏蔽下层存储引擎,分库,chace的复杂性;
(2)任何需求方不能绕过service读写其后端的数据;
 
服务之间通过缓存传递数据,我坚决反对!
假设有其他service要有数据获取的需求,应该通过service提供的RPC接口来访问,而不是直接读写后端的数据,无论是cache还是db。
 
综上所述
(1)数据管道场景,MQ比cache更合适;
(2)多个服务不应该公用一个cache实例,应该垂直拆分解耦;
(3)服务化架构,不应该绕过service读取其后端的cache/db,而应该通过RPC接口访问;
 
希望逻辑是清晰的,供大伙参考,欢迎探讨。
调研
你遇到过服务之间通过缓存传递数据的架构设计么?
 
相关文章
读服务+写服务分离架构,我坚决反对!
小手一抖,好文服务之间通过缓存传递数据,我坚决反对!

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/6345

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月12日 下午9:13
下一篇 2022年5月12日 下午11:42

相关推荐

  • MySQL写缓冲(change buffer),终于懂了!!!(收藏)

    上篇《MySQL缓冲池(buffer pool),终于懂了》,介绍了InnoDB缓冲池的工作原理。   简单回顾一下: (1)MySQL数据存储包含内存与磁盘两个部分; (2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page); (3)InnoDB以变种LRU算法管理缓冲池,并能够解决“预读...

    2022年5月10日
    1000
  • 无锁缓存,每秒10万并发,究竟如何实现?

    有一类业务场景: (1)超高吞吐量,每秒要处理海量请求; (2)写多读少,大部分请求是对数据进行修改,少部分请求对数据进行读取; 这类业务,有什么实现技巧么?   接下来,一起听我从案例入手,娓娓道来。   快狗打车,场景举例: (1)司机地理位置信息会随时变化,可能每几秒钟地理位置要修改一次; (2)用户打车的时候查看某个司机的地理位置,查询地理位置的频率...

    2022年5月14日
    6000
  • 用友致远A6 OA存在sql注入并拿shell

    用友致远A6协同系统 /yyoa/common/js/menu/test.jsp 文件 S1 参数SQL注入漏洞 注入点为S1变量,通过探测,发现是mysql数据库 http://xx/yyoa/common/js/menu/test.jsp?doType=101&S1= 于是构造注入语句查询数据库名: http://xx/yyoa/common/j...

    技术 2022年6月2日
    8000
  • use_algolia_search

    去algolia官网注册账号 新建index索引 Blog   在hex项目下安装 1 2 3 4 5 6 7 8 9 10 # npm install hexo-algolia --save # export HEXO_ALGOLIA_INDEXING_KEY=xxxxxxxxxxxxxxxxxxxxxx # hexo algolia INFO ...

    技术 2022年6月2日
    1600
  • Docker部署sonar

    0x00 前言 Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测。   0x01 安装 获取 postgresql 的镜像 1 $ docker pul...

    技术 2022年6月1日
    2500

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信