1+ import asyncio
2+ import logging
3+
4+ from aioamqp .exceptions import AioamqpException
15from sage_utils .amqp .base import AmqpWorker
26from sage_utils .amqp .clients import RpcAmqpClient
37
48
9+ LOGGER = logging .getLogger (__name__ )
10+
11+
512class BaseRegisterWorker (AmqpWorker ):
613 """
714 Base class for implementing worker which is registering a new
815 microservice in Open Matchmaking platform.
916 """
17+ MAX_RETRIES = 5
18+ RETRY_TIMEOUT = 10
19+
1020 REQUEST_QUEUE_NAME = "auth.microservices.register"
1121 REQUEST_EXCHANGE_NAME = "open-matchmaking.direct"
1222 RESPONSE_EXCHANGE_NAME = "open-matchmaking.responses.direct"
@@ -24,8 +34,31 @@ async def run(self, *args, **kwargs):
2434 response_queue = '' ,
2535 response_exchange = self .RESPONSE_EXCHANGE_NAME
2636 )
27- response = await client .send (self .get_microservice_data (self .app ))
2837
29- assert 'error' not in response .keys (), response ['error' ]
30- assert 'content' in response .keys ()
31- assert response ['content' ] == 'OK'
38+ is_registered = False
39+ microservice_data = self .get_microservice_data (self .app )
40+ for _ in range (self .MAX_RETRIES ):
41+ try :
42+ response = await client .send (
43+ payload = microservice_data ,
44+ consume_timeout = self .RETRY_TIMEOUT
45+ )
46+
47+ if 'error' in response .keys ():
48+ LOGGER .error ("Received validation errors: {}" .format (response ['error' ]))
49+ else :
50+ assert 'content' in response .keys ()
51+ assert response ['content' ] == 'OK'
52+ is_registered = True
53+
54+ break
55+ except (AioamqpException , TimeoutError ):
56+ LOGGER .error (
57+ "Can't receive a response because the Auth/Auth microservice isn't "
58+ "responding or the required queues and the exchanges aren't created. "
59+ "Retry after {} second(s)." .format (self .RETRY_TIMEOUT )
60+ )
61+ await asyncio .sleep (self .RETRY_TIMEOUT , loop = self .app .loop )
62+
63+ if not is_registered :
64+ raise ConnectionError ('Occurred an error during registering microservice.' )
0 commit comments