Domanda

è difficile cercarlo se è stato chiesto in precedenza poiché non ne conosco il nome. Quindi ecco qui:

Sto creando questo server che si collega ai gateway di messaggistica per inviare messaggi. Una sessione con questo gateway richiede una combinazione nome utente / password. In questo modo il gateway sa chi fatturare.

Ora potrei avere migliaia di messaggi in coda per l'invio, appartenenti ad esempio a 5 diverse combinazioni nome utente / password. Tuttavia, il gateway è limitato e ho solo 2 connessioni aperte contemporaneamente.

Così efficacemente si tratta di domanda e offerta con vincoli:

Ho un gateway che può gestire solo N connessioni simultanee (nome utente / combo pw) Ho X messaggi in pila appartenenti a Y diversi di queste connessioni

come posso gestire in modo efficiente e pulito queste connessioni in modo che a volte possano dare spazio per altre connessioni, forse anche prendere in considerazione la priorità, forse anche consentire connessioni multiple con lo stesso nome utente / password per una maggiore velocità (se non ostacola altre connessioni in coda)

Qualcuno ha la minima idea di che tipo di algoritmi esistono per questo? Quindi posso cercarlo su Google. O forse qualcuno già può darmi alcuni suggerimenti.

Ho dato qualche accenno a me stesso, ma sento che non sto ancora ancora creando una soluzione elegante, ma in qualche modo finisco in dichiarazioni if ??annidate a lungo

grazie

È stato utile?

Soluzione

Come menzionato in un altro poster, è necessario disporre di una coda di priorità, anche se suggerisco di ibridare la coda di priorità con una coda di code.

  1. Per ogni connessione (nome utente / password), creare una semplice coda LIFO. Il modulo che riceve i messaggi dovrebbe accodarli per l'utente appropriato.
  2. Il modulo dispatcher dovrebbe mantenere una coda di code ordinata per priorità. Ciò implica che hai una funzione priorità (coda) che calcola la priorità per una data coda in base al numero di messaggi, priorità dell'account, tempo dall'ultimo invio, ecc. Implementazione della priorità (coda ) è lasciato come esercizio al lettore.
  3. Il ciclo interno del dispatcher toglie le N code con priorità più alta dalle code di coda, stabilisce una connessione al gateway per ciascun nome utente / password e invia tutti i messaggi in quelle code. Le code appena svuotate ritornano nella coda delle code. Ricalcola la priorità per tutte le code, risciacqua e ripeti.

Idealmente, la parte di invio del messaggio del passaggio 3 potrebbe essere multi-thread.

Un'implementazione alternativa del passaggio n. 3 sarebbe quella di inviare messaggi da ciascuna coda fino a quando la priorità di quella coda non scende al di sotto della priorità della coda di attesa successiva. Tuttavia, ciò implica che ricalcoli priorità (coda) dopo ogni invio, che può essere più costoso di quanto valga la pena.

Altri suggerimenti

Concettualmente si desidera implementare una Coda di priorità .

Dato che hai idee specifiche su quale messaggio dare la priorità rispetto ad altri, vorresti un'implementazione che ti consenta di calcolare un punteggio di priorità per ogni voce della coda. Poiché a volte vuoi raggruppare i messaggi, dovresti anche essere in grado di esaminare la coda quando assegni la priorità a una nuova voce di coda (ad esempio, potresti decidere di impostare la priorità di un nuovo elemento uguale alla priorità dell'ultimo esistente elemento con lo stesso nome utente purché non più di N elementi abbiano già quella priorità.

Dato che hai un numero fisso di gateway in uscita, probabilmente vorrai una coda di priorità per gateway. Un componente di routing che accetta un nuovo messaggio e determina su quale coda posizionarlo potrebbe esaminare gli elementi in ciascuna coda esistente per determinare su quale posizionarlo meglio (ovvero posizionarlo nella stessa coda di altri elementi con lo stesso ID utente) se che ottimizzerà la produttività.

Se il tuo gateway è anche un po 'più lento dell'algoritmo di routing, avrai un netto aumento della velocità rendendo l'algoritmo di routing il più intelligente possibile.

Dai un'occhiata agli algoritmi di pianificazione delle attività del sistema operativo e di rete. Tentano di risolvere molti problemi simili nell'assegnare i tempi di una risorsa limitata a un numero maggiore di consumatori. C'è un'enorme quantità di ricerche là fuori. In particolare, ponderazione equa ponderata sembra che potrebbe essere utile per te.

Eventuali scelte particolari dipendono fortemente dal comportamento che si desidera che l'algoritmo abbia. Ad esempio, se si desidera ridurre al minimo la latenza per tutte le code, si dovrà dare la priorità alle code con i messaggi più vecchi e magari assegnare sezioni più grandi a code più lunghe.

D'altra parte, potresti voler impedire a qualcuno che esegue invii batch di grandi dimensioni, poiché i loro messaggi avranno comunque una lunga latenza e lasceranno le code con un uso leggero prima dell'invio batch.

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