Architecture 如果没有公用事业微服务,公用事业微服务无法正常工作,是否应该/能否将公用事业微服务与所有受抚养人合并?

Architecture 如果没有公用事业微服务,公用事业微服务无法正常工作,是否应该/能否将公用事业微服务与所有受抚养人合并?,architecture,microservices,Architecture,Microservices,TL;DR:如果您正在分析任何给定的微服务体系结构,并且正在将服务A和B合并在一起,以避免A因为B故障而无法工作(因为它严重依赖于B,并且如果B出现故障,则根据项目规范A无法完成请求),如果迭代次数足够多,您不打算使用单片架构吗 这是我们公司最近提出的一个问题,恐怕他们做出了一个短视的决定 架构概要: -这是我们第一个使用微服务体系结构的系统 -我们有N数量的微服务(具体来说,每个微服务都是一个JAR,在集群中的kubernetes pod中运行) -每个JAR通过HTTP API公开单个服务

TL;DR:如果您正在分析任何给定的微服务体系结构,并且正在将服务AB合并在一起,以避免A因为B故障而无法工作(因为它严重依赖于B,并且如果B出现故障,则根据项目规范A无法完成请求),如果迭代次数足够多,您不打算使用单片架构吗


这是我们公司最近提出的一个问题,恐怕他们做出了一个短视的决定

架构概要:
-这是我们第一个使用微服务体系结构的系统
-我们有
N
数量的微服务(具体来说,每个微服务都是一个JAR,在集群中的kubernetes pod中运行)
-每个JAR通过HTTP API公开单个服务(例如,
auth
用户
图像
…) -99%的服务需要用户授权,但不需要身份验证(这是在另一层上完成的,我们的服务假设如果请求到达它,请求头包含有效的用户令牌
-为了将用户令牌转换为有形的东西(例如用户信息),我们向
用户
服务发出请求
-目前,每个服务都会这样做,以验证用户是否满足某些特定于服务的标准

现在,在一次会议上,几位高级开发人员提出了他们的担忧,如果
用户
由于某种原因失败(不一定是软件相关的,让我们假设分配给这些服务的机器有故障),一切都将停止工作,这(在他们看来)带有额外步骤的准单片体系结构。他们建议避免这种情况,将
用户
服务转换为静态库,并将其作为依赖项添加到所有需要它的服务中,因此每个服务本身都包含此功能,而不依赖于远程API

但是这不是一个更大的规范问题,而不是架构问题吗?它不像
images
API(从技术上讲)如果没有
用户就无法运行,只是根据当前的项目规范未指定在这种情况下它应该做什么,因此它只是失败了,就好像服务本身有故障一样


我个人认为这是一个短视的决定的原因是,有人可能会争辩说,微服务之间的任何通信都可以被视为这样的风险。这个案例只是一个非常明显的潜在故障点,也是“什么可以打破”的第一次迭代分析。经过充分考虑,如果没有指定“计划B”,那么许多服务使用的任何端点都可以以相同的方式处理(例如,如果无法从
图像
服务中提取图像,请使用预定义的占位符图像)

如果对所讨论的业务用例不了解,我倾向于同意您的观点。我认为可以通过以下方式缓解所讨论的问题:

  • 通过将响应缓存在单个服务可访问的集中缓存系统中,尝试减少服务的负载。使用事件源和更改数据捕获(首选基于日志)保持缓存更新

  • 在适当的情况下,探索在单个服务数据库中引入物化视图的可能性,包括物化视图、事件来源和变更数据捕获(最好基于日志)

  • 探索通过断路器使用回退响应的可能性。请注意,如果自由用户希望在用户服务关闭时观看高级视频,则业务部门可能希望允许自由用户观看视频,而不是限制高级用户


  • 我对你的话题有两点看法:

    • Re:规范。当某件事情失败时,您定义了一种“替代”行为

      示例:图像服务从用户服务请求作者信息,以显示上传图像的人的信息

      我的理解是,如果图像服务无法获取作者信息,您已选择图像请求失败。如果用户服务不可用,您可以选择将作者姓名显示为“N/A”,或者干脆不在图像中显示任何用户信息

      你定义了另一条路径。当然,每种方法都有利弊,这取决于一个场景

    • 回复:建筑

      IMHO,我认为微服务体系结构的好处之一是隔离各个服务。我不知道您当前的体系结构,但在传统的微服务中,我希望用户服务具有隔离存储,并且只为其他服务公开HTTP(或RPC等)接口以获取该信息

      如果您开始将其用作库,您将陷入这样的境地:一旦更改“用户服务”库,您就必须跨所有服务对其进行升级,否则架构或业务逻辑差异将随着时间的推移而显现。在最坏的情况下,为升级创建顺序依赖关系

      我认为您只需将用户服务视为体系结构的一个关键部分,并真正致力于使其具有高可用性,即确保它至少部署在几个不同的主机上(如果您支持的话,甚至可以部署在多个地区)


    这对于架构决策来说是非常典型的,因为存在一些权衡,可能会通过另一个质量属性的成本来改善某些质量属性。在您的案例中,将用户服务转换为库的决策将提高可靠性,但问题是什么样的质量