zookeeper通过多实例应用程序进行记录处理



我有一个微服务应用程序,该应用程序具有基于isProcessed=false标志从DB中提取数据的调度器。它每1秒连续运行一次,每次轮询50条记录。在成功读取和处理之后,它将行的值更新为isProcessed=true。我使用JDBC选择和更新来对应用程序执行DB操作。

目前,我正在运行一个应用程序实例,如果我想运行多个微服务实例,这将是DB行中的竞争条件。应用程序的多个实例轮询同一行并更新两次。如何避免在多实例应用中对同一记录进行多次轮询。

是否有任何方法可以使用zookeeper在多个实例之间进行协调,以获得所选DB记录的信息。在多实例中,一个实例读取的DB行应该被锁定,而不应该被其他实例读取。

我的表看起来像(1,2,3未处理,4,5已处理并更新(

---------------------------
C1 | C2 | C3 | isProcessed
----------------------------
1  | a  | 3  | false
2  | b  | 3  | false
3  | c  | 3  | false
4  | d  | 3  | true
5  | f  | 3  | true

运行多个实例将提高我的记录数据库处理性能,因为多个实例可以在同一个数据库上工作。如何避免通过不同的微服务重叠/处理相同的记录。

为什么选择ZooKeeper?ZooKeeper用于协调不同节点上的多个进程。为什么不在DB表中使用一些标志,以便在不同的微服务之间分配工作?微服务1处理带有标志1的记录,微服务2处理带有标志2的记录,依此类推,标志是根据活动微服务的数量随机生成的。您也可以为每个客户端使用不同的表,或者使用同一表的不同分区。您还可以为表上的标志使用一个序列,并将每个微服务当前正在处理的标志的值(标志标志+49(存储在不同的表上,其中每个客户端都有自己的条目。行锁定可能也很有用。

最新更新