2017-04-20 164 views
6

我們正在創建一個使用Akka.NET的新系統,並具有分片和持久性的基本集羣設置。Akka .NET連接池超時問題

我們已經使用官方文檔以及一些Petabridge博客帖子來使分片正常工作。但是,我們遇到了分片超過SQL Server連接池允許的最大連接數的問題。因此,我們得到以下信息...

2017年4月20日14:04:31.433 +01:00【警告】「超時過期的 超時時間已過獲取連接之前, 發生這種情況的原因可能是因爲所有連接的池都在使用中,並且最大池大小已達到 。「

我們認爲當分片更新分片日誌時會發生這種情況。

分區模塊如何正確管理其SQL連接?這裏有配置問題嗎?

發生此類錯誤時,是否可以重試它?就目前而言,我們會爲此錯誤的每個實例丟失消息。

下面是相關HOCON

cluster.sharding { 
    journal-plugin-id = "akka.persistence.journal.sharding" 
    snapshot-plugin-id = "akka.persistence.snapshot-store.sharding" 
} 
persistence { 
    journal { 
     plugin = "akka.persistence.journal.sql-server" 
     sql-server { 
      class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer" 
      connection-string = "Server=.;Database=akkasystem;Integrated Security=true" 
      schema-name = dbo 
      auto-initialize = on 
     } 
     # a separate config used by cluster sharding only 
     sharding { 
      connection-string = "Server=.;Database=akkasystem;Integrated Security=true" 
      auto-initialize = on 
      plugin-dispatcher = "akka.actor.default-dispatcher" 
      class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer" 
      connection-timeout = 30s 
      schema-name = dbo 
      table-name = ShardingJournal 
      timestamp-provider = "Akka.Persistence.Sql.Common.Journal.DefaultTimestampProvider, Akka.Persistence.Sql.Common" 
      metadata-table-name = ShardingMetadata 
     } 
    } 
    snapshot-store { 
     sharding { 
      class = "Akka.Persistence.SqlServer.Snapshot.SqlServerSnapshotStore, Akka.Persistence.SqlServer" 
      plugin-dispatcher = "akka.actor.default-dispatcher" 
      connection-string = "Server=.;Database=akkasystem;Integrated Security=true" 
      connection-timeout = 30s 
      schema-name = dbo 
      table-name = ShardingSnapshotStore 
      auto-initialize = on 
     } 
    } 
} 

回答

1

這可能是因爲SQL雜誌上充斥着傳入的事件如此嚴重,是連接超時觸發一個標誌,而事件正等待從池中的下一個連接是釋放。

從你的配置我懷疑,這可能發生,如果你已經開始持續事件和創建高比率的碎片/實體。現有的SQL日誌將在不久的將來大幅提升速度(請參閱batching journals)。希望這可以幫助解決你的問題。

+0

我們目前關注的主要問題是,我們實際上最多隻能傳遞一次這些消息。無論何時發生SQL超時,應該執行的操作都會丟失。 我們希望通過使用Akka.Persistence,我們能夠實現至少一次交付。到目前爲止,這似乎不是這種情況。您能否告知我們如何實現這一目標,以便重試操作/發生超時時不會丟失消息? – Aaron

+0

[此片段](https://gist.github.com/Horusiath/64d829720b66df16bc59dbf106a8008e)或多或少是如何構建代理角色的示例,這些代理角色至少是一次傳遞網關。但請記住它會限制你的演員以冪等的方式處理傳入的消息。同樣,如果你真的想獲得至少一次交付語義,通常最好在通信鏈前放置一個隊列(即RabbitMQ甚至Kafka),如果失敗,只需重新啓動未處理消息的過程。 – Horusiath