KSQL一致性

时间:2018-12-09 15:55:06

标签: apache-kafka ksql

我正在使用dotnet和ksql进行PoC。 https://github.com/pablocastilla/kafkiano/

总体思路是看我是否可以使用KSQL实现业务逻辑。在示例中,我介绍了库存中的设备并从中订购。该示例包含以下内容:

两个主要流:

  • 库存流收到添加到库存的事件。
  • 订单流接收产品订单。

使用这些流,我创建了两个表:

  • ProductStock:它只是将产品添加到库存中
  • 订单:按产品计数订单

在这两个表之后,我创建了另一个表,该表具有订单和库存中产品之间的差异,只是想知道是否还有产品。

有了最后一个表中的联接和订单流,当处理该订单时,我可以剩下库存。

我将使用产品名称作为键来介绍事件。到目前为止,它在我的机器上运行良好,但是我的问题是:

  • 在大型生产环境中这是否一致?我想知道在并行接收到许多事件时何时破坏一致性的限制。

  • 我如何知道哪些查询先于其他查询执行?我需要先计算库存和订单之间的差异,然后再通过订单流加入该差异

谢谢

KSQL:
//INVENTORY STREAMS
CREATE STREAM InventoryEventsStream (ProductName VARCHAR, Quantity INT) WITH (kafka_topic='INVENTORYEVENTS', key='ProductName', value_format='json');

//TABLE GROUPING BY PRODUCT
CREATE TABLE  ProductsStock as select ProductName,sum(Quantity) as Stock from InventoryEventsStream group by ProductName;

// ORDERS STREAMS
CREATE STREAM OrdersCreatedStream (ProductName VARCHAR,Quantity INT, OrderId VARCHAR, User VARCHAR) WITH (kafka_topic='ORDERSEVENTS', key='ProductName', value_format='json');
//TABLE GROUPING BY PRODUCT
CREATE TABLE ProductsOrdered as select ProductName as ProductName,sum(Quantity) as Orders from  ORDERSCREATEDSTREAM group by ProductName;

// join with the difference
CREATE TABLE StockByProductTable  AS  SELECT ps.ProductName as ProductName,ps.Stock - op.Orders as Stock FROM PRODUCTSORDERED op JOIN ProductsStock ps ON op.ProductName = ps.ProductName;

//logic: I want the stock left when I make an order
SELECT ocs.OrderId,ocs.User,sbpt.Stock FROM OrdersCreatedStream ocs JOIN  StockByProductTable sbpt ON sbpt.ProductName = ocs.ProductName;

1 个答案:

答案 0 :(得分:0)

我复制并粘贴从融合团队获得的github answer

“我收到您的问题。对您问题的一个最小答案是,只要您的消息在流中可用,它就会立即执行。

一个很好的类比是总是运转的机器。 只要有效负载进入内部,它就会对其进行处理。现在,您可以在链接部分找到您了。您是否在处理后将一些有效负载插入到新的记录流?然后,可以将其称为“链接”。运行/执行CTAS / CSAS语句后,您会看到类似“表/流已创建并正在运行”之类的信息。

您已点燃了一个始终运行的查询!”