0

I have a question regarding processing from a message queue in spring - to which i am very new. I am trying to increase throughput of an application which reads from a queeue and writes to a database live financial information. The problem is messages have to remain ordered, ie first in first out. This means my original approach of increasing the number of concurrent consumers is not viable as there is potentially the case where ordering is lost.

Changing the concurrent consumers for 1 to 5 meant i could process 10,000 and save a good amount of time. (approx 20 mins)

Being fairly new to Spring and being a graduate developer (in my first year) i am unsure what alternatives there are. Spring batch is something that has cropped up but, because it is finiancial information trades need to be processed from the queue as soon as possible so I cant wait for a batch of 500 to fill up for example.

Please could someone suggest what approaches are viable for this type of scenario using spring?

Thanks

4

2 に答える 2

0

以下は、メッセージ駆動型チャネル アダプターと Jdbc アウトバウンド アダプターを使用して、Spring Integration でこのタイプの消費を行う方法の例です。パフォーマンスとスループットに影響を与えるいくつかの重要な事項は次のとおりです。

  • トランザクション - キューを経由してデータベースに送信される場合、オーバーヘッドが追加されます
  • 変換 - メッセージ マッピングをテーブルに変換するために必要な処理量

これが Spring Integration の例です。

<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

それは非常に大雑把ですが、出発点になる可能性があります。単純な単体テストのパフォーマンスは、1 秒あたり平均約 200 メッセージでしたが、これはハードウェアに少し依存しています。

于 2013-07-14T00:51:47.490 に答える
0

要求と同じ順序でデータベースに書き込む必要がある場合は、完全にシングル スレッドです。

ただし、データベースからデータを読み戻すときに順序を決定できるようにしたい場合は、順序フィールドが正しく維持されていることを確認するだけで済みます (通常、タイムスタンプは十分ではないことに注意してください。最小精度) したがって、タイムスタンプと追加の順序値により、正確な順序を決定できます。

したがって、シングル スレッド入力では、タイムスタンプと順序値を追加してから、要求をデータベース ライターのプールに渡します。

注文値は、毎分または適切な期間にリセットできます。

于 2013-07-17T06:25:46.920 に答える