java - 微服务架构中的请求应该在 1 秒内得到响应
问题描述
最近,我遇到了一个java面试问题。它是这样的:“有 3 个微服务(流程从第 1 到第 2 到第 3),至少需要 0.5 秒的迂回来提供响应。但是 Web 请求本身应该在 1 秒内得到响应。如何实现这一点?”
任何架构设计或模式或任何设置,需要做什么?
解决方案
这是一个非常模糊的问题,没有简单的直接答案,更多的是确定您将朝哪个方向发展,您将建议哪些分析选项。它的可靠性工程(SRE)包括许多技巧和方法。
- 我将首先分析和澄清此请求序列实现了哪些业务流程,考虑不必要的(碰巧并非总是开发人员编写正确的代码,因此对服务、数据库等进行了一些不必要的调用)
- 监控网络延迟并确定重点区域。如果网络需要很长时间,那么改进网络硬件或软件是有意义的,寻找问题,客户端重新发送数据时的坏包,“包风暴”问题等。如果网络良好,专注于服务。
- 然后考虑缓存来自下游服务的数据(进行中缓存或分布式取决于架构和数据类型)。这一步应该在充分了解数据性质的情况下仔细完成,例如是否可以缓存,在哪个时期,使用哪种方式刷新/驱逐数据?
- 注意执行的代码优化的可能性。碰巧的是,开发人员在实现过程中没有考虑性能,因此可以创建具有不需要操作的功能(例如一些排序、过滤、同步(带锁)等)。
- 3.的一部分,并行化代码执行中可能发生的一切(不保证它有帮助),摆脱锁。例如,在调用下游服务之前/之后可能存在对 DB 或其他源的一些依赖,这可能会导致不可预测的阻塞,在这种情况下,在并行线程中执行任务而不相互阻塞是有意义的。
- 如果没有低级技巧帮助,它可以敲响警钟重新审视服务架构,例如如果 SLO 1 非常重要,那么将 1+2 或 2+3 微服务加入更大的服务以减少数据转换可能是有意义的并在服务之间转移(需要先计算)。
还有很多事情要考虑,取决于你想去多深。
推荐阅读
- c++ - 您可以使用 Google Test 将复杂类型传递给参数化测试吗?
- node.js - 在没有目录的firebase存储中获取文件
- django - 使用 Django 通道发送图像
- c - 当我尝试在 int d 中输入一些值时,为什么链表会出错?
- java - 无法使用来自集群外部机器(Windows)的 java 类的 JDBC 连接到 Kerberized HIVE/hadoop 集群(linux)
- c++ - 在 Visual Studio 的同一个项目中创建多个 C++ 文件
- javascript - Shopify:单击按钮时如何将产品名称添加到输入字段表单?
- python - 在新列中转换 json 内容
- node.js - 检索 URL 参数
- php - 想通过 HTACCESS 绕过 CDN 域。重写规则需要帮助