🔄 RPC Pattern

Le pattern RPC (Remote Procedure Call) avec RabbitMQ permet d'implémenter des appels de procédures distantes asynchrones tout en conservant les avantages de la messagerie (persistance, load balancing, monitoring).

🎯 Principe

Rendu du diagramme en cours...

💻 Implémentation

Client RPC

class RPCClient {
    constructor() {
        this.pendingRequests = new Map();
    }
    
    async call(method, params, timeout = 30000) {
        const correlationId = uuid();
        const replyQueue = await this.channel.assertQueue('', {exclusive: true});
        
        return new Promise((resolve, reject) => {
            const timer = setTimeout(() => {
                this.pendingRequests.delete(correlationId);
                reject(new Error('RPC timeout'));
            }, timeout);
            
            this.pendingRequests.set(correlationId, {resolve, reject, timer});
            
            this.channel.publish('', 'rpc_queue', Buffer.from(JSON.stringify({
                method, params
            })), {
                correlationId,
                replyTo: replyQueue.queue
            });
        });
    }
}

Server RPC

def rpc_server():
    def process_request(ch, method, props, body):
        try:
            request = json.loads(body)
            result = handle_rpc_call(request['method'], request['params'])
            
            # Répondre avec même correlation_id
            ch.basic_publish(
                exchange='',
                routing_key=props.reply_to,
                body=json.dumps(result),
                properties=pika.BasicProperties(
                    correlation_id=props.correlation_id
                )
            )
            ch.basic_ack(delivery_tag=method.delivery_tag)
            
        except Exception as e:
            ch.basic_reject(delivery_tag=method.delivery_tag, requeue=False)
    
    channel.basic_consume(queue='rpc_queue', on_message_callback=process_request)
    channel.start_consuming()

Le pattern RPC combine la simplicité des appels de fonction avec la robustesse de la messagerie asynchrone.

📝 Testez vos connaissances !

Répondez à 10 questions pour valider ce cours