Domanda

Questa si basa su Come inviare messaggi tra Società . Se decido che la società S (upplier) dovrebbe interrogare ordini dalla società (B) in qualche semplice HTTP basato Way qual è la migliore implementazione.

  • Presumo società B ha un web server in esecuzione e il database back-end di questo Webserver è durevole. Dobbiamo commettere meno una possibile ipotesi sui processi di stoccaggio a S e se sono in grado di mantenere lo stato (ad esempio un elenco di GUID già trasmessi)
  • La connessione a Internet tra B e S non è affidabile.
  • Dobbiamo raggiungere eventuale coerenza significato a un certo punto nel tempo tutti gli ordini tra B e S dovrebbe essere trasferito.

Qual è la prassi migliore per attuare un tale sistema?

È stato utile?

Soluzione

Un approccio a questo tipo di problema è quello di utilizzare una sorta di accodamento del prodotto, come una persona IBM ho subito considero MQ. Tuttavia, come io non sono in realtà MQ persona me stesso, come voi probabilmente sarei stato felice con l'approccio basato servizio che si sta assumendo.

Ci sono due possibili approcci che vengono in mente. Uno è quello di utilizzare la WS Reliable Messaging, che spinge il problema di affidabilità giù nel servizio Web infrastruttura. L'altro è quello di manovella il proprio protocollo affidabile sulla parte superiore del semplice, ma inaffidabile, servizi.

Non ho seria esperienza pratica di attuazione di un sistema con WS Reliable Messaging, credo che possa essere fatto per il lavoro, ma richiede un certo grado di controllo sui partecipanti - come è una relativamente recente abbiamo di serie non può garantire che qualsiasi dato negozio avrà un'implementazione a portata di mano, e l'interoperabilità tra i fornitori possono essere un problema. Il controllo più che ho nel corso degli stacks SW ad ogni estremità del più inclini mi sarebbe di usare WS Reliable Messaging. [Devo dire WS Atomic Transaction troppo, che può anche essere utilizzato per costruire servizi realiable, si applicano le stesse preoccupazioni inter-op.]

E per quanto riguarda roll-your-own? La chiave qui è quello di rendere tutti i servizi idempotente. Come non abbiamo garanzie transazionali che si estendono i due sistemi dobbiamo supporre che un dato chiamata di servizio potrebbe non riuscire con esito sconosciuto.

ho intenzione di assumere che B vuole avere la conferma che S ha preso un ordine, quindi abbiamo bisogno di informazioni di aggiornamento sia a B e S quando un ordine è trasferito.

B deve offrire servizi come questi:

 Give me the next order(s)

 I have stored {orders ...}

Quindi, come possiamo definire "next". Il caso più semplice funziona bene se i volumi che stiamo trattando possono permettere di avere un unico "filo" del trasferimento. Poi B scorre fuori gli ordini inviati uno alla volta, e gli ordini hanno una monotona crescente ID. Possiamo quindi semplificare a:

 I have stored order <65,004> please give me the next

Si noti che questa è una richiesta idempotente: si può tranquillamente ripetuto molte volte. Si noti inoltre che S deve prevedere la possibilità di ottenere lo stesso ordine due volte, e controllare i duplicati.

Altri suggerimenti

Quello che state cercando è probabilmente commit a due fasi. E 'ben descritto in internet, qui ad esempio:

http://en.wikipedia.org/wiki/Two-phase_commit_protocol

L'essenza di esso:

Il commit processo procede come segue:

* Phase 1
      o Each participating resource manager coordinates local 
        operations and forces all log records out:
      o If successful, respond "OK"
      o If unsuccessful, either allow a time-out or respond "OOPS" 
* Phase 2
      o If all participants respond "OK":
            * Coordinator instructs participating resource managers to "COMMIT"
            * Participants complete operation writing the log record
              for the commit 
      o Otherwise:
            * Coordinator instructs participating resource managers to "ROLLBACK"
            * Participants complete their respective local undos 

I lavori dovrebbero per ogni tipo di dati.

Va bene, prima di tutto non è possibile garanzia qualcosa di più di un collegamento inaffidabile. Il due generali problema dimostra per entrambi i protocolli deterministiche e non deterministiche. Tutto quello che puoi fare è mitigare l'inaffidabilità di un grado accettabile.

Il metodo più semplice è, nel tuo caso, una volta che il server riceve una richiesta di sondaggio, invia il numero x di risposte, tutti con lo stesso GUID. Per esempio.

S: B, anything new?
S: B, anything new?
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
...

S può ottenere spammato con gli ordini, ma dal momento che il # viene inviato con ogni richiesta, non è un grosso problema. Se abbiamo perso prima, stiamo ottenendo ora. Se non siamo riusciti prima, Woohoo! Noi abbiamo ora. Il sistema funziona! Si noterà che B invia messaggi 5 volte nel mio esempio. In uno scenario realistico si sarebbe probabilmente inviare un messaggio di centinaia o migliaia di volte, fino ad avere l'affidabilità desiderata.

Ora la soluzione di cui sopra è l'elaborazione e larghezza di banda ad alta intensità, ma funziona. Un metodo più intelligente è quello di fare ciò che non TCP:. Ha una stretta di mano a tre vie

S: Hello B. Are you there? -> SYN
B: Hello S, yep I'm here. What's up? -> SYN+ACK
S: Oh good, you're there. -> ACK
S: B, anything new?
B: Yes, S, I need a jacket (order #123).

Ma .. HTTP già fa questo. Quindi, se qualcosa non arrivare da qualche parte, lo saprete. Timeout della connessione, il collegamento è rotto, ecc.

Ora, si potrebbe riscrivere questi scenari all'interno del livello di applicazione (inserire WS-ReliableMessaging), ma in realtà TCP è già affidabile. Alcuni critici di questi quadri SOAP (ish) e faux-protocolli (lavorano sulla parte superiore del HTTP di solito) li accusano di reinventare la ruota essenzialmente - ed i problemi della ruota -. Su un livello più alto di astrazione

La conclusione è che ogni sistema può fallire, compresi i sistemi di messaggistica affidabili.

Per quanto riguarda l'eventuale consistenza è interessato, penso che si può essere confusi. Eventuale coerenza si applica solo ai sistemi di storage distribuiti dove dopo una Write(), potrebbe non essere in grado di recuperare in modo deterministico con una Read() per qualche tempo. Questo non sembra come il vostro problema a tutti. Voglio dire, vedo quello che stai dicendo, ma in un sistema eventually consistent, una connessione affidabile (abbastanza) si ipotizza tra i nodi. Non si fanno ipotesi che (anche se penso che si dovrebbe .. TCP è maledettamente affidabile).

Costruire su ciò che, dina menzionato. Webservices sarebbe una soluzione perfetta al problema di cui sopra. Alcuni protocollo può essere concordato che sarebbe definire il numero di record.

S ---> D ( Call a service which would list record keys)
D----> S ( provide xml of keys)
S----> D ( Request each of the records)
D----> S ( Submit record)

In caso di una nuova voce record di essere fatta dopo la sincronizzazione, destinazione può richiamare un servizio distribuito alla fonte, che avrebbe gestito un nuovo record.

Poiché la comunicazione è gestita acquistare un motore di servizio web, non è necessario preoccuparsi circa i parametri del messaggio. SSL può essere aggiunto per la sicurezza.

Cheers!

Penso che si sta cercando di dire che la società B è un partecipante passivo. S (fornitore) ha solo bisogno la possibilità di ottenere tutti gli ordini che posti B (consistenza finale). Ma B non ha bisogno di assistenza su ciò che gli ordini S ha già (senza bisogno di commit).

Se la società B ha un orologio semi-accurata, è possibile utilizzare la data come monotona crescente GUID, a seconda della risoluzione degli eventi - non si vuole sondaggio se avete bisogno di risoluzione millisecondo in ogni caso. È utilizzare solo l'orologio del B in modo da non dovete preoccuparvi di sincronizzazione. Se B pubblica tutti gli ordini, S può solo raccogliere gli ordini da dove si era interrotti.

Non sono sicuro se si intende migliori pratiche o migliori compromessi per un facile da implementare il sistema. A seconda del volume e tempo di risposta, non è necessario per renderlo un sistema dinamico, se si vuole prelevare in ogni caso. Dump ordini come file di testo (nominati dal timestamp) in una directory di nome in base alla data e tirare tutti verso il basso (o in modo selettivo). È anche possibile memorizzarli nella directory di ora in ora o qualsiasi altra cosa ha un senso. HTTP GET è idempotente.

Questo potrebbe essere brutto, ma sembra che tu non vi aspettate molto la complessità della ditta B. Usa SSL e autenticazione ed è bloccato e criptato.

Se non avete bisogno di prestazioni non c'è niente di sbagliato con semplice. Che cosa si guadagna davvero da un protocollo complicato?

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