首先将数据放在Kafka还是数据库中?

时间:2018-10-25 07:40:13

标签: database apache-kafka

将数据先放入Kafka然后再放入数据库时​​,te pro的优点和缺点是什么?

一个例子: 用户执行REST(POST)调用来存储产品。通常,我会在后端接听此调用,然后将正文保存到数据库中(经过验证等)。 最好的方法是接听此电话并将数据存储在Kafka拳中,然后将其保存到数据库(在这种情况下,数据库是kafka使用者)。

还是先将其保存在数据库中,然后将其发送到kafka更好?

谢谢

4 个答案:

答案 0 :(得分:2)

这完全取决于您的要求。

  1. 如果您希望功能为:

-推送至kafka主题日志异常并退出失败。

-无论kafka推送成功与否都无法保存数据。

-使使用者将其保存到数据库。我假设在发送消息时,您想在侦听器方法中处理数据。因此,这取决于要在数据库中保留的数据状态。

  1. 此外,如果您使用的是Kafka,您将要调用另一个微服务,这是您要更新的表,同时公开给这两个服务,即,如果服务共享数据库(理想情况下不会共享数据库)。

  2. 如果未共享数据库,并且您仍要保留在对kafka进行pushMessage调用之前或之后需要保存的数据,因为这是检查消息是否成功发送的范围或不。 pushMessage将具有on失败方法,您可以在其中抛出异常,并根据失败进一步保存数据或退出。

答案 1 :(得分:2)

让我们以您的用例来举例说明这两种情况,用于存储产品的api调用可以说PRODUCT1:

您的数据库:product_table(product_id,product_name,product_info)

API伪代码:

  1. valiadteProductInfo
  2. 保存-首先在kafka中或在数据库中

方法1-

首先保存到kafka意味着您可能会在一段时间后在数据库中看到该结果,您将把产品ID返回给用户,如果用户想填充产品ID,则该ID将不可见。对我来说,这是不正确的方法,因为这样一来,您就需要在UI端处理很多事情。

方法2- 首先保存到db,然后保存到kafka,有两种情况: 1. kafka push在代码中是同步的-在这种情况下,发送到kafka失败,这在您的业务案例中非常关键,因为其他微服务是依赖的。这不是正确的方法,但是如果推送失败,并且在<0.001%的时间内成功,那么您可以从数据库中删除产品并将异常返回给用户。我认为完全可以。

  1. kafka推送是通过轮询db的更改并将更改放入kafka的(为此了解有关EventSourcing的信息):在这种情况下,您将获得100%的保证,但是会有一些延迟。这也可以使用

答案 2 :(得分:1)

我更喜欢把Kafka放进去,因为它可以确保消息不会丢失并且持久。但是,如果您将第一个放入db,则将Kafka放在db和kafka之间。

答案 3 :(得分:0)

您首先需要创建各种主题,这些主题将在Kafka中充当数据队列。然后,您将拥有将写入数据库的数据的使用者。如果一个组件发生故障,这将允许您重新进入系统。

此外,如果您还有其他任何数据使用者,则可以轻松地创建kafka队列的使用者,并通过已达成共识的通用接口(REST,SOAP,RPC等)将其暴露给您的使用者。

此外,您可以通过使每个主题具有多个阅读器,然后将其请求联合到数据库来扩展性能。