Nous créons un nouveau système utilisant Akka.NET et disposons d'une configuration de base de cluster avec fragmentation et persistance.Problèmes de délai d'expiration du pool de connexion Akka .NET
Nous avons utilisé la documentation officielle ainsi que certains articles de blogs Petabridge pour que le sharding fonctionne correctement. Cependant, nous avons rencontré un problème où les fragments dépassent le nombre maximal de connexions autorisées par le pool de connexions SQL Server. En tant que tel, nous recevons le message suivant ...
2017-04-20 14: 04: 31,433 +01:. 00 [Avertissement] « Délai d'attente expiré Le délai d'expiration écoulé avant d'obtenir une connexion Cela peut être dû au fait que toutes les connexions groupées étaient utilisées et que la taille maximale du pool a été atteinte. "
Nous pensons que cela se produit lorsque les fragments mettent à jour le journal de fragmentation.
Comment le module sharding ne gère-t-il pas correctement ses connexions SQL? Y a-t-il un problème de configuration ici?
Est-il possible de l'amener à réessayer lorsque ce type d'erreur se produit? En l'état, nous perdons des messages pour chaque occurrence de cette erreur.
Voici les HOCON pertinentes
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
}
}
}
La principale préoccupation que nous avons en ce moment est que nous recevons effectivement la plupart du temps une livraison sur ces messages. Chaque fois qu'un délai d'attente SQL se produit, l'action qui aurait dû être effectuée est perdue. Nous espérions qu'en utilisant Akka.Persistence nous serions en mesure d'obtenir une livraison au moins une fois. Cela ne semble pas avoir été le cas jusqu'à présent. Pourriez-vous nous conseiller sur la façon dont nous pourrions y parvenir afin que les actions soient réessayées/les messages ne sont pas perdus quand un délai d'expiration se produit? – Aaron
[Cet extrait] (https://gist.github.com/Horusiath/64d829720b66df16bc59dbf106a8008e) est plus ou moins un exemple de la façon de construire un acteur proxy fonctionnant comme une passerelle de livraison au moins une fois. Cependant, n'oubliez pas que cela contraindra vos acteurs à gérer les messages entrants de manière idempotente. Aussi, si vous voulez vraiment obtenir une sémantique de livraison au moins une fois, c'est souvent une bonne idée de simplement mettre une file d'attente (par exemple RabbitMQ ou même Kafka) devant votre chaîne de communication, et en cas d'échec redémarrez simplement le message non géré . – Horusiath