假设我有一个基于微服务的架构。一些微服务比其他微服务负载更重。我如何决定对每个组件进行多少扩展?我的理解是我做负载测试&找出每个服务可以承受多少负载&基于我扩展的一些服务说3倍,一些5倍等等。现在假设我有一个服务 - 支付服务- 这取决于第 3 方支付网关,它速度慢且不在我的控制范围内 - 如何处理?我可以自由地将应用程序和用户 docker/kubernetes 容器化。
缓慢的第 3 方支付处理器可能需要几秒钟来处理请求。这将以各种方式影响您的架构。
首先,您的支付服务不应公开可能需要几秒钟才能响应的入口点。
服务消耗的内存和一些其他类型的资源与同时请求的数量成正比,而后者与响应时间成正比。如果你的慢服务可以将所有上游服务的响应时间乘以10 或 100 倍,那么它可以将这些资源的消耗乘以相同的系数,这是不可接受的。让每个人等待几秒钟而没有状态反馈也是不可接受的。
因此,您需要的不是“processPayment”入口点,而是:
所有这些入口点都应该很快。
此外,支付处理在几秒钟内跨多个请求的传播意味着您不能真正依赖所有内容一直保持不变。因此,正在进行的事务及其状态更新必须保存在持久存储中——某种数据库。您可能无论如何都想这样做,因为“开始付款”和“检查状态”请求不应该以同一个服务实例结束,而数据库是将状态从一个实例传达到另一个实例的原因。
与第 3 方处理器的通信通常应该由“工作”进程/线程处理,因为请求处理线程不是为这些类型的响应时间提供的。如果通过对第 3 方处理器的单个请求来处理付款,那么使用异步客户端调用该服务就很重要,这样您就不必同时保持数千个线程处于活动状态。客户端计算机上的网络堆栈也可能需要仔细配置以支持该数量的同时连接。
最后,由于正在处理资金,因此确保交易不会被遗忘,确保您始终可以检查其状态,并防止因重试而导致多次付款,一直到用户界面,这一点至关重要。支付处理器将提供足够的 API 以允许您无论如何都执行此操作,但这可能需要您仔细设计。
为了支持所需的用户界面,您还需要一个入口点,该入口点可以检查交易是否已经在进行中以用于任何特定目的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句