我們正在創建一個使用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
}
}
}
我們目前關注的主要問題是,我們實際上最多隻能傳遞一次這些消息。無論何時發生SQL超時,應該執行的操作都會丟失。 我們希望通過使用Akka.Persistence,我們能夠實現至少一次交付。到目前爲止,這似乎不是這種情況。您能否告知我們如何實現這一目標,以便重試操作/發生超時時不會丟失消息? – Aaron
[此片段](https://gist.github.com/Horusiath/64d829720b66df16bc59dbf106a8008e)或多或少是如何構建代理角色的示例,這些代理角色至少是一次傳遞網關。但請記住它會限制你的演員以冪等的方式處理傳入的消息。同樣,如果你真的想獲得至少一次交付語義,通常最好在通信鏈前放置一個隊列(即RabbitMQ甚至Kafka),如果失敗,只需重新啓動未處理消息的過程。 – Horusiath