java - 微服务设计:一个调用还是两个单独的 API?
问题描述
我有一个执行以下逻辑的单片应用程序:
Get a list A (Customer) from database
Validate data in A using some criteria, if it's not validated, throw an error
Do some operations on A to get a list B (e.g. Regional customers)
Do sth with B
现在我正在使用微服务转换我的应用程序,但我在设计调用时遇到了麻烦。
由于 B 可以完全从 A 推导出来,我只想制作一个getCustomerA
返回所有数据集 A 的微服务。这意味着需要单个数据库访问。这将是一个性能优势。
但问题是,在 A 上检索列表 B 的操作也是业务代码的一部分。所以把这些代码放在客户微服务端更合乎逻辑,如果我们遵循领域驱动设计,在微服务中Customer
,也许getRegionalCustomer
。
所以我想知道,在这种情况下最好的做法是什么?我们应该优先考虑单个数据库调用(第一种情况)还是最好进行两次调用(但在这种情况下,是 2 个数据库调用)?
解决方案
由于这主要是基于意见,我只能给你:-)
根据我的经验,将应用程序拆分为微服务只是为了做到这一点,将技术教条置于技术简单性之上,并且经常引入许多不必要的开销。
关于数据库调用,我还可以根据经验告诉你,在执行两个简单的调用而不是执行一个过于复杂的调用时,你通常会赢得性能。特别是如果您开始在许多表上引入大连接或 - 哎哟 -on
子句中的子选择。
看看最简单的解决方案是否有效并保持代码整洁。不断提高质量并在需要时进行优化。如果您有一段逻辑需要拆分为微服务(例如,因为您想使用不同的语言、框架或想要卸载一些计算),那么就去做吧。
推荐阅读
- python-3.x - 在python中计算条件概率
- python - 为什么Seaborn的pip安装后出现属性错误
- javascript - 带有 Javascript 的 Sticky Sidebar 效果(不使用插件)
- facebook-instant-articles - Google Analytics + FB Instant ARticles:应该使用什么来源/媒介使 IA 流量显示在“社交”频道中
- javascript - 如何检查对象是否需要密钥
- sed - 使用 sed 替换正则表达式和包含数字的变量
- node.js - 使用 nodejs 监控 S3 存储桶的成本
- kendo-ui - 我可以根据标题内容制作我的 kendo-grid-column 宽度大小吗?
- vbscript - 如果满足语句,则启动程序
- java - 将游戏窗口移到其他窗口 LibGDX 前面