Domanda

Ho un produttore che voglio distribuire il lavoro in modo coerente in tutto i consumatori hashing coerente. Ad esempio, con consumatori nodi X e Y, compiti A, B, C deve sempre andare a consumatori X, e D, E, F a Y. consumatore, ma che può spostare un po 'se Z si unisce al pool di consumatori.

Non volevo a che fare con la scrittura la mia logica di connettersi ai nodi di consumo, e soprattutto non con la gestione di nodi di giunzione e di lasciare la piscina, quindi sono andato giù per il sentiero di usare RabbitMQ, e una coda esclusiva per nodo consumatore.

Un problema che sto funzionando in è messa in vendita di queste code, dal momento che il produttore ha bisogno di conoscere tutte le code disponibili prima che il lavoro è distribuito. AMQP non ha nemmeno supporta code di quotazione, il che mi rende incerta di tutto il mio approccio. RabbitMQ e Alice ( voce rotta al momento ) add tale funzionalità però: c'è un'API della messa in vendita code e scambi su RabbitMQ?

E 'questo un sapiente uso di coniglio? Dovrei usare una coda di messaggi a tutti? C'è una migliore progettazione in modo che il coda può sempre dividere il mio lavoro tra i consumatori, invece di aver bisogno di farlo?

È stato utile?

Soluzione

Ciò che si descrive è fattibile in RabbitMQ.

La configurazione sarebbe qualcosa di simile:

  • un produttore pubblica il messaggio a un cambio argomento; Diamo il nome consistent_divider;
  • quando un consumatore, si unisce alla piscina, si collega al broker e crea una coda di esclusiva con il suo nome, ma non si lega a nulla
  • Il produttore interroga periodicamente il broker (magari usando list_consumers rabbitmqctl) per verificare se i consumatori sono cambiate; se hanno, rimuove tutte le associazioni esistenti e rebinds le code come necessario;
  • quando il produttore pubblica, i messaggi vengono assegnate una chiave di routing che corrisponde al tipo di attività.

Quindi, se si dispone di 6 tipi di attività: A, B, C, D, E, F, e solo due consumatori C1 e C2, le associazioni sarebbe simile: C1 legato 3 volte a consistent_divider con le chiavi di routing A, B e C; C2 legato 3 volte a C_D con le chiavi di routing D, E e F.

Quando C3 unisce la piscina, il produttore vede questo e rebinds le code di conseguenza.

Quando il produttore pubblica, invia i messaggi con routing_keys A, B, C, D, E e / o F, ei messaggi otterrà instradati alle code corrette.

Ci sarebbero due potenziali problemi con questo:

  1. C'è un leggero ritardo tra quando il consumatore si unisce alla piscina e messaggi ottenere instradato ad essa; Inoltre, se ci sono messaggi già nelle code, è possibile che un consumatore di ottenere messaggi significava per un altro consumatore (ad esempio C3 unisce, i rebinds produttori, ma C2 ottiene ancora alcuni messaggi E e F perché erano già in coda),
  2. Se un consumatore muore per qualsiasi motivo, i messaggi nella sua coda (e in rotta verso la sua coda) andranno perse; questo può essere risolto con la ripubblicazione e morti-lettering i messaggi, rispettivamente.

Per rispondere alla tua ultima domanda, probabilmente si desidera utilizzare l'accodamento e RabbitMQ è una grande scelta, ma le vostre esigenze (più precisamente il bit `dividere il lavoro in modo coerente') non AMQP abbastanza in forma perfettamente.

Altri suggerimenti

Si potrebbe utilizzare il coerente-hashing ufficiale plug-in per RabbitMQ come risposta qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top