2013-07-08 2 views
0

J'ai une question concernant le traitement d'une file d'attente de messages au printemps - à laquelle je suis très nouveau. J'essaie d'augmenter le débit d'une application qui lit à partir d'une queue et écrit dans une base de données en direct des informations financières. Le problème est que les messages doivent rester commandés, c'est-à-dire premier entré, premier sorti. Cela signifie que mon approche originale consistant à augmenter le nombre de consommateurs simultanés n'est pas viable car il y a potentiellement un risque de perte de commande. En changeant les consommateurs simultanés de 1 à 5, j'ai pu en traiter 10 000 et économiser beaucoup de temps. (environ 20 minutes)Traiter efficacement depuis TIBCO via SPRING

Étant assez nouveau au printemps et étant un développeur diplômé (dans ma première année) je ne sais pas quelles sont les alternatives. Le lot printanier est quelque chose qui a surgi mais, parce que les métiers de l'information financière doivent être traités dans la file d'attente le plus tôt possible, je ne peux pas attendre un lot de 500 à remplir par exemple.

S'il vous plaît quelqu'un pourrait suggérer quelles approches sont viables pour ce type de scénario en utilisant le printemps?

Merci

Répondre

0

ci-dessous est un exemple de la façon de faire ce type de consommation avec l'intégration Spring en utilisant le canal géré par messages adaptateur et l'adaptateur sortant Jdbc. quelques éléments clés qui auront une incidence sur votre performance et à travers sont les suivants;

  • transactions - si elle va dans la file d'attente à la base de données qui ajoutera certains frais généraux
  • transformation - à quel point le traitement va dans la conversion du mappage de message à la table

est ici l'intégration de printemps Exemple;

<int-jms:message-driven-channel-adapter channel="trade.input.channel" 
    concurrent-consumers="1" connection-factory="connectionFactory" 
    destination="issue.queue"/> 

<int:channel id="trade.input.channel"/> 

<int-jdbc:outbound-channel-adapter 
    channel="trade.input.channel" 
    data-source="dataSource" query="insert into target_table (issue_code,issue_price,transaction_timestamp) values (:issue_code,:issue_price,:issue_timestamp)" 
    sql-parameter-source-factory="spelFactory"/>  

<bean id="spelFactory" class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory"> 
    <property name="parameterExpressions"> 
     <map> 
      <entry key="issue_code" value="payload.toString().split(',')[0]"/> 
      <entry key="issue_price" value="payload.toString().split(',')[1]"/> 
      <entry key="issue_timestamp" value="payload.toString().split(',')[2]"/> 
     </map> 
    </property> 
</bean> 

et voici l'exemple un message

MSFT,100.00,1373761697932

il est très difficile, mais pourrait être un point de départ. la performance sur un test unitaire simple était d'environ 200 messages par seconde en moyenne, mais cela dépend un peu du matériel.

0

Si l'exigence est d'écrire dans la base de données dans le même ordre que les demandes, vous êtes complètement threadé. Cependant, si vous voulez être en mesure de déterminer l'ordre lors de la lecture des données hors de la base de données, il vous suffit de vous assurer que le champ de commande est correctement géré (notez qu'un horodatage ne suffit généralement pas plusieurs demandes dans la précision minimale) de sorte qu'un horodatage plus une valeur de commande supplémentaire vous permettra de déterminer l'ordre exact.

Donc, une entrée à un seul thread, ajoutez un horodatage et une valeur de commande, puis passez la requête à un pool d'auteurs de base de données.

La valeur de la commande peut être réinitialisée toutes les minutes ou quelle que soit la période appropriée.