读写一个数据库的两个微服务 table
Two microservices for read and write to one database table
我对微服务最佳实践方法有点困惑。
以下场景:
Massive incoming messages from mqtt devices. A rest api where customers could read the messages (mostly only a part of them).
我的想法是,创建一个微服务来将消息存储在数据库中 table。第二个微服务休息 api 来阅读这些消息。
由于缩放问题,我想这样做。 (传入存储部分比读取其余部分需要更多的功率api)
我读到 "perfect" 微服务应该是唯一一个访问他在数据库中的数据的微服务。因此其他微服务应该通过其 API 而不是在数据库级别请求此数据。
所以我的方法不是完美的。我看到了一些处理此问题的选项:
- 只有一个微服务,用于存储和读取
- 在存储微服务中创建一个api,其余微服务可以在其中获取数据。
但所有这些都不适合我。
你怎么看?
此致,
马库斯
我将推荐一种方法,该方法在某种程度上取决于对以下问题的回答:
从消息提交到数据库到消息可供客户查看的最大可接受时间延迟是多少?
如果这个问题的答案 > 10 毫秒,那么您可以考虑使用 read-write separation - 您的用例似乎是一个很好的用例。
虽然这可能会给您的解决方案带来更多的复杂性,但这种方法的好处包括:
- 数据库写入和读取之间没有争用
- 写入可以独立缩放。
- 您写入的数据可以以关系格式存储
- 可以以最简化检索和显示问题的方式读取客户数据(例如非规范化、与视图模型对齐)
将此应用到您的体系结构中,即使不使用某种持久队列传输,仍然可以实现读写分离,但更难实现。与其利用事件,不如让整个事情由命令驱动。
这里的主要区别是您需要在主数据库写入和随后对负责更新读取模型的服务的调用中强制执行“可事务性”。
实际上,除非您在读取或写入方面执行计算密集型操作,否则您的数据库 IO 很可能是您争论的焦点。我会强烈考虑构建您的系统 "perfect",然后 运行 进行容量测试以查看瓶颈所在。不要忘记 Donald Knuth 的话:“Premature optimization is the root of all evil”。
如果您决定需要扩展您的服务,请查看是否可以水平扩展读取和写入(创建更多组合服务实例)。
如果这无法让您获得所需的性能,那么请查看更复杂的扩展要求,就像另一个回答者 。
我对微服务最佳实践方法有点困惑。
以下场景:
Massive incoming messages from mqtt devices. A rest api where customers could read the messages (mostly only a part of them).
我的想法是,创建一个微服务来将消息存储在数据库中 table。第二个微服务休息 api 来阅读这些消息。 由于缩放问题,我想这样做。 (传入存储部分比读取其余部分需要更多的功率api)
我读到 "perfect" 微服务应该是唯一一个访问他在数据库中的数据的微服务。因此其他微服务应该通过其 API 而不是在数据库级别请求此数据。 所以我的方法不是完美的。我看到了一些处理此问题的选项:
- 只有一个微服务,用于存储和读取
- 在存储微服务中创建一个api,其余微服务可以在其中获取数据。
但所有这些都不适合我。
你怎么看?
此致, 马库斯
我将推荐一种方法,该方法在某种程度上取决于对以下问题的回答:
从消息提交到数据库到消息可供客户查看的最大可接受时间延迟是多少?
如果这个问题的答案 > 10 毫秒,那么您可以考虑使用 read-write separation - 您的用例似乎是一个很好的用例。
虽然这可能会给您的解决方案带来更多的复杂性,但这种方法的好处包括:
- 数据库写入和读取之间没有争用
- 写入可以独立缩放。
- 您写入的数据可以以关系格式存储
- 可以以最简化检索和显示问题的方式读取客户数据(例如非规范化、与视图模型对齐)
将此应用到您的体系结构中,即使不使用某种持久队列传输,仍然可以实现读写分离,但更难实现。与其利用事件,不如让整个事情由命令驱动。
这里的主要区别是您需要在主数据库写入和随后对负责更新读取模型的服务的调用中强制执行“可事务性”。
实际上,除非您在读取或写入方面执行计算密集型操作,否则您的数据库 IO 很可能是您争论的焦点。我会强烈考虑构建您的系统 "perfect",然后 运行 进行容量测试以查看瓶颈所在。不要忘记 Donald Knuth 的话:“Premature optimization is the root of all evil”。
如果您决定需要扩展您的服务,请查看是否可以水平扩展读取和写入(创建更多组合服务实例)。
如果这无法让您获得所需的性能,那么请查看更复杂的扩展要求,就像另一个回答者