UPDATE :ons ondersteuningsartikel voor dit onderwerp (in wezen een kopie van dit bericht) is verplaatst naar ons document voor het oplossen van problemen met verbindingen.
Er is een bekend probleem waarbij het Azure IaaS-netwerk een time-out voor inactiviteit van ongeveer dertien minuten afdwingt (empirisch vastgesteld). We werken samen met Azure om te zien of we de zaken niet gebruiksvriendelijker kunnen maken, maar in de tussentijd hebben anderen succes gehad door hun stuurprogramma-opties te configureren om het probleem te omzeilen.
Maximale inactieve tijd van verbinding
De meest effectieve oplossing die we hebben gevonden bij het werken met Azure en onze klanten, was om de maximale inactieve tijd van de verbinding in te stellen op minder dan vier minuten. Het idee is om de driver inactieve verbindingen te laten recyclen voordat de firewall het probleem forceert. Een klant die de C#-driver gebruikt, stelt bijvoorbeeld MongoDefaults.MaxConnectionIdleTime
in tot één minuut en het loste hun problemen op.
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);
De applicatiecode zelf is niet veranderd, maar nu achter de schermen recyclet de driver op agressieve wijze inactieve verbindingen. Het resultaat is ook te zien in de serverlogboeken:veel verbindingsverloop tijdens inactieve perioden in de app.
Er zijn meer details over deze aanpak in de gerelateerde mongo-gebruikersthread, SocketException met behulp van C#-stuurprogramma op azure.
Keepalive
Je kunt het probleem ook omzeilen door je verbindingen minder inactief te maken met een soort keepalive. Dit is een beetje lastig te implementeren, tenzij uw stuurprogramma het standaard ondersteunt, meestal door gebruik te maken van TCP Keepalive. Als u uw eigen verbinding moet maken, zorg er dan voor dat u elke paar minuten elke inactieve verbinding uit de pool haalt en een eenvoudig en goedkoop commando geeft, waarschijnlijk een ping.
Verbindingen afhandelen
Verbindingen kunnen van tijd tot tijd worden verbroken, zelfs zonder een agressieve firewallconfiguratie. Voordat je in productie gaat, wil je er zeker van zijn dat je ze correct behandelt.
Zorg er eerst voor dat u automatisch opnieuw verbinden inschakelt. Hoe dit te doen verschilt van stuurprogramma tot stuurprogramma, maar wanneer het stuurprogramma detecteert dat een bewerking is mislukt omdat de verbinding slecht was, wordt automatisch opnieuw verbinding ingeschakeld en vertelt het stuurprogramma dat hij moet proberen opnieuw verbinding te maken.
Maar dit lost het probleem niet helemaal op. U hebt nog steeds het probleem wat u moet doen met de mislukte bewerking die het opnieuw verbinden heeft geactiveerd. Automatisch opnieuw verbinden probeert mislukte bewerkingen niet automatisch opnieuw. Dat zou gevaarlijk zijn, vooral voor schrijvers. Dus meestal wordt er een uitzondering gegenereerd en wordt de app gevraagd om deze af te handelen. Vaak is het opnieuw proberen lezen een no-brainer. Maar het opnieuw proberen van schrijven moet zorgvuldig worden overwogen.
De mongo shell-sessie hieronder demonstreert het probleem. De mongo-shell heeft standaard automatisch opnieuw verbinden ingeschakeld. Ik voeg een document in een verzameling in met de naam stuff
zoek dan alle documenten in die verzameling op. Ik zette toen een timer op dertig minuten en probeerde dezelfde vondst opnieuw. Het mislukte, maar de shell maakte automatisch opnieuw verbinding en toen ik het onmiddellijk opnieuw probeerde, werkte het zoals verwacht.
% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p ***
MongoDB shell version: 2.2.2
connecting to: ds012345.mongolab.com:12345/mydatabase
> db.stuff.insert({})
> db.stuff.find()
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }
> db.stuff.find()
Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345
Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345]
Fri Jan 18 13:29:28 DBClientCursor::init call() failed
Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345
Error: error doing query: failed
Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345
Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok
> db.stuff.find()
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }
We zijn er om te helpen
Als u vragen heeft, neem dan gerust contact met ons op via [email protected] We zijn er om u te helpen.