database - 将数据放在 Kafka 或数据库中?
问题描述
将数据先放入 Kafka 再放入数据库或以其他方式放入数据时,优缺点是什么?
一个示例:用户执行 REST (POST) 调用来存储假设产品。通常我会在后端接听这个电话并将正文保存到数据库中(在验证和所有之后......)。接这个调用并将数据存储在 Kafka 拳头中,然后将其保存到数据库(在这种情况下,数据库是 kafka 消费者)是否是最佳实践。
还是先存入数据库,再发给kafka比较好?
谢谢
解决方案
让我们用您的用例举例说明这两种情况,用于存储产品的 api 调用让我们说 PRODUCT1:
你的数据库:product_table(product_id , product_name,product_info)
API伪代码:
- valiadteProductInfo
- 保存 - 首先在 kafka 或 DB 中
方法 1 -
首先保存到 kafka 意味着您可能会在一段时间后在数据库中看到该结果,您会将产品 ID 返回给用户,如果用户想要填充产品 ID,则它不可见。对我来说,这不是正确的方法,因为您将需要在 UI 端处理许多事情以应对这种延迟。
方法 2 - 首先保存到 db,然后保存到 kafka,有两种情况:1. kafka 推送在代码中同步 - 在这种情况下,发送到 kafka 失败,这在您的业务案例中非常关键,因为其他微服务是依赖的。这不是正确的方法,但是如果在推送失败的情况下 <0.001% 的时间是可以的,然后您从数据库中删除产品并将异常返回给用户。我认为这完全没问题。
- kafka 推送是通过轮询数据库的更改并将更改放入 kafka(请阅读有关 EventSourcing 的内容):在这种情况下,您将获得 100% 的保证,但会有一些小的延迟。这也可以使用
推荐阅读
- javascript - Slick.js 自定义分页钩子和 CSS
- jmodelica - 无法在 Ububtu 上安装 JModelica
- javascript - 所有最长的字符串。
- javascript - 无法读取 null 的属性“年龄”
- powershell - 如何编写一个脚本来读取其他脚本并记录它们的过程?
- javascript - 如何检测内存中的 DOM 元素是否是块元素?
- tableau-api - 重命名 Tableau 中最后一个月列的标题
- http - 带有 API2 webhook 的 Google Dialogflow:无法解析响应
- javascript - 编写测试“cookie clicker”游戏
- ibm-cloud - NodeRED bluemix/IBM Cloud 启动器安装失败并出现 IAM 错误