2013-07-08 89 views
0

我有一個關於從春季的消息隊列處理的問題 - 我很新。我正在嘗試增加從queeue讀取並寫入數據庫實時財務信息的應用程序的吞吐量。問題是消息必須保持有序,即先進先出。這意味着增加併發消費者數量的原始方法是不可行的,因爲可能存在訂購丟失的情況。從TIBCO通過SPRING高效處理

更改1到5的併發消費者意味着我可以處理10,000並節省大量時間。 (約20分鐘)

作爲一名相當新的春季和作爲研究生開發人員(在我的第一年),我不確定有什麼替代方案。春天的批次已經出現了,但是,因爲它是財務信息交易,需要儘快從隊列中處理,所以我不能等待一批500人來填補。

請有人建議使用spring的這種類型的場景可行的方法是什麼?下面

由於

回答

0

是如何執行此類型的消費用Spring集成驅動通道適配器和JDBC出站適配器的消息的示例。一些會影響你的表現和通過投入的關鍵因素如下:

  • 交易 - 如果它在整個隊列要去那會增加一些開銷
  • 改造數據庫 - 多少處理進入的消息映射轉換表中

這裏的Spring集成例;

<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> 

和這裏的樣本消息

MSFT,100.00,1373761697932

這是非常粗糙的,但可能是一個起點。簡單單元測試的性能平均每秒大約200條消息,但這與硬件有關。

0

如果要求是以與請求相同的順序寫入數據庫,那麼您完全是單線程的。

但是,如果您希望在從數據庫中讀取數據時能夠確定訂單,那麼您只需確保訂單字段得到正確維護(請注意,時間戳通常不夠可能,因爲您可能會得到在最低精度內的多個請求),所以時間戳加上附加的訂單值將允許您確定確切的訂單。

因此,單線程輸入,添加時間戳和訂單值,然後將請求傳遞給數據庫編寫器池。

訂單價值可以重置每分鐘或任何適當的時期。