簡體   English   中英

Spring 啟動Web服務/微服務和調度

[英]Spring boot Webservice / Microservices and scheduling

我有一個 spring 啟動應用程序,它公開了 REST API,並且還計划添加一個 spring 啟動計划任務。

任務的目的是從 momgodb 數據存儲中獲取一些待處理的“保留”並處理它。

現在的問題是當多個服務實例運行時,所有節點很可能會選擇相同的“預訂記錄”。

我正在查看 mongodb 鎖,並正在檢查 mongodb 的 updateAndModidy / transactions (in 4.x)。

也有可能只有一條記錄的單獨鎖定表,其中我鎖定記錄並執行操作和解鎖記錄。 但是這種方式一次只有一個節點在工作,如果解鎖操作失敗,也會產生清理鎖的開銷。

所以問題是關於運行和調度上述任務的多個服務實例。 無論技術如何(spring boot / mongodb 等),如果有人能指出圍繞該主題的最佳實踐或解決方案,我將不勝感激。

根據您的部署,適用於我們的解決方案是使用 Hazelcast 創建包含來自同一應用程序的節點的集群,然后在運行任務時,所有節點檢查它們是否是主節點,並且只有主節點運行任務。

您可以在此處閱讀 Spring 中有關 Hazelcast 的介紹: https://josdem.io/techtalk/spring/spring_boot_hazelcast_es/

我們使用的是帶有 Consul 的 Hazelcast,因此我們不必手動配置 ips/端口,使用以下命令: https://github.com/bitsofinfo/hazelcast-consul-discovery-spi

如果您沒有很多(動態)節點,這是一個相對簡單的解決方案,對我們來說效果很好(3 個節點,與 Jenkins 的領事/fabio 協調零停機時間部署)

過去我們讓 Quartz 調度協調所有節點,使用一個通用的 JDBC 數據源作為 Quartz 的同步機制,但是實現是錯誤的,我們時不時會遇到必須手動解鎖的 TABLE 鎖,殺死一些節點。

干杯

編輯:

這是我們的 class 之一的外觀:

// Optionally autowired, in case we don't run in a cluster (development)
private final Optional<HazelcastInstance> hazelcast;

    @Scheduled(cron = "${refresh.cron}")
    public void scheduledRefresh() {
        // Run if we are not in a cluster or 
        // we are the first member of the cluster
        if (!hazelcast.isPresent() || 
   hazelcast.get().getCluster().getMembers().iterator().next().localMember()) {
    // Run restricted method
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM