Come architettare l'elaborazione ordinata prioritaria tra due app con più thread che producono / consumano richieste?

0

Chiedo scusa se il titolo della domanda è un po 'fuorviante. Ho due app X e Y entrambe implementate in java. App X viene eseguita nel contenitore Apache Servicemix e Y è l'app Web in esecuzione nel server dell'app jee (spesso nel cluster). X esegue l'elaborazione in batch e all'interno di ciascun batch potrebbe produrre un numero qualsiasi di richieste per l'App Y. Queste richieste vengono scritte su una coda jms activemq. App Y ha un numero configurabile di thread (normalmente 10 o più) che consumano queste richieste dalla coda jms. Uno dei limiti che ho è che App Y fa molto affidamento sul commit a due fasi, cioè sulla transazione XA. Il messaggio consumato da Y è nella transazione XA in cui rende alcuni aggiornamenti del database e eventualmente inoltra il messaggio a un'altra coda. Il problema attualmente è:

  • L'app X richiama il batch B1 e scrive 10 richieste jms in coda.

  • Poiché Y ha 10 thread di consumo, tutte queste richieste vengono elaborate contemporaneamente.

  • Non tutte le richieste sono della stessa natura / priorità e tutte e 10 le richieste che vengono elaborate contemporaneamente causano problemi in quanto la richiesta prioritaria apparentemente più bassa potrebbe essere completata prima della priorità più alta.

  • Spesso accade che l'attività con priorità più bassa che generalmente è una richiesta di controllo di tutte le richieste di un batch completato termina prima che le richieste vengano effettivamente completate.

Non posso semplicemente ridurre il numero di thread consumati, poiché ha già dimostrato di degradare drasticamente le prestazioni e creare il backlog.

Ho provato a implementare una logica di blocco sull'ID batch nell'App B in modo che venga elaborata solo una richiesta di un singolo batch, ma anche quella è controproducente. Ci sono casi in cui A ha prodotto 100 di richiesta della stessa priorità e sarebbe felicemente elaborato contemporaneamente da B quindi non avrebbe senso strozzarli uno alla volta.

Quindi in sostanza la mia domanda è, come posso implementare una logica in modo che App Y consuma / elabora richieste della stessa priorità per ogni particolare batch? Ciò significa anche che se l'App X producesse due richieste ciascuna di priorità inferiore e superiore per due batch B1 e B2. È giusto che l'app Y elabori contemporaneamente richieste con priorità più alta dato che ha thread di consumo inutilizzati disponibili per esso.

    
posta Setu 12.07.2018 - 12:20
fonte

0 risposte

Leggi altre domande sui tag