none
一個股票 權證 帳務損益即時監控系統 RRS feed

  • 一般討論

  • 我現在 有一個需求 使用者提出
    1. 大概  二百多檔的股票或權證
    2. 當價格 或者 使用者有進行交易時 會觸發 event  即時運算損益

    以前一個離職同事有寫一個 三十秒批次才 算的程式
    現在遇到幾個"架構"上的問題
    1. 兩百多檔的資料  即時運算一些損益 或者  delta 值  因為 股價一直進來  讓系統變的很慢
    2. 若想偷偷 用timer 去跑  可是 我用前同事的運算class 去做  就花了 好幾秒  (每一檔都跑完)
       這樣 就沒有即時 會被使用者念

    我想請各位 高手  看看 面對這樣的一個需求  你們會採怎樣的架構去做呢
    我先講我的想法
    1. 把每個 股票或權證 建立一個thread (但 感覺 反而會變慢 )
    2. 運算部份  的 延遲  我還在想辦法 讓使用者 感覺不出來 其實 在背後有偷偷運算
        我有用 ThreadPool 去把前同事的 算法 都擺在 threadpool中 但 感覺沒改善耶

    這個議題請大家來幫忙想想吧

    2010年3月18日 下午 12:03

所有回覆

  • 你的股價進來是用哪個方式接收資料的 ?
    你建立Thread時, Thread負責哪些工作 ?
    在Thread中是有建立起哪些執行個體 ?
    線索不太詳細.不怎麼容易想.


    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月18日 下午 03:10
    版主
  • 你的股價進來是用哪個方式接收資料的 ?
    你建立Thread時, Thread負責哪些工作 ?
    在Thread中是有建立起哪些執行個體 ?
    線索不太詳細.不怎麼容易想.


    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情

    1. 股價接收方式  是去註冊公司 有架一台 Quote Server 若有新的報價會透過  socket 傳送過來
        我在 client 端用delegate , event 的方式去 trigger, 使用者下單也是透過 gateway 主動 push 給有訂閱的 Client端
    2. 至於 Thread 是我 自己現在 初步在想的 就是 因為 每檔股票 或 權證 在一開始 就會先載入基本資料 算一些init的損異 
        這時  是把資料擺在 DatagridView 上  為了不影響 Datagridview的 畫面會卡卡的 就想到用thread 但實際細節 我還在思考
        怕做下去  會因為  不斷重算  造成畫面變相卡住
        
        而只要 有新股價進來 或者 使用者下單有回報的 event 就去 重算 這些損益 在show 在 datagridview 上
       
        我有想過用  WCF 中 IPC 的傳輸方式  可是 又怕 同一台機器  用IPC 會不會讓整個速度更慢
        其實  問題點就是  怎樣的 架構  讓這樣的需求 能 "感覺" 即時" 卻又正確

        因為 我覺得  運算 會花的時間  少不了  其它能少的  還有 什麼方法跟 架構去思考呢?!
    2010年3月18日 下午 03:33
  • 這類問題作法通常是
    1.Event接收時就應該立即先運算好,並將結果儲存起來.而因為你的每個計算都是長時間,所以必須採用一些Queue機制來做排隊,避免大量資料進入時太多的thread反而導致運算更慢,至於同時間可運算多少必須看機制而定,故通常這類機制是必須可以透過設定來調整同時運作的thread大小,這邊介紹你一個Library可以解決此問題
    http://www.codeproject.com/KB/threads/smartthreadpool.aspx
    而在.Net 4.0也已有類似機制.
    當然如果你的資料多到一台機制無法處理,這時候你必須自行處理該如何將資料作分散式運算.


    2.顯示端就單純了,只要把結果顯示出來即可.

    2010年3月18日 下午 11:17
  • 這類問題作法通常是
    1.Event接收時就應該立即先運算好,並將結果儲存起來.而因為你的每個計算都是長時間,所以必須採用一些Queue機制來做排隊,避免大量資料進入時太多的thread反而導致運算更慢,至於同時間可運算多少必須看機制而定,故通常這類機制是必須可以透過設定來調整同時運作的thread大小,這邊介紹你一個Library可以解決此問題
    http://www.codeproject.com/KB/threads/smartthreadpool.aspx
    而在.Net 4.0也已有類似機制.
    當然如果你的資料多到一台機制無法處理,這時候你必須自行處理該如何將資料作分散式運算.


    2.顯示端就單純了,只要把結果顯示出來即可.


    謝謝你的意見

    第一點我有些不太明白  你的意思是說 當收到 event時 將運算的事 建立一個thread 擺到 threadpool 中

    然後 可以利用 smartThreadPool 來改善效率  是這樣嘛 

    我剛看了一下  smartThreadpool   恕小弟愚昧  我有點不太懂 它有什麼好處耶

    可否  給點  hint

     

    2010年3月19日 上午 12:07
  • 一般簡易的處理方式是,一個Event進來就產生一個thread來進行運算,但這種作法遇到當有瞬間大量Event同時產生時可能會導致系統崩潰,如果你的情況不會有此現象就不需要做處理,但通常很難預期不會發生.

    smartThreadPool的好處是,它本身並非是即時處理,它內部有個Queue,你可以指定smartThreadPool同時間可使用多少個thread,但Queue的數量超過thread的數量時,剩下的Event就會先暫存於Queue中等待.這樣做的好處是,不會因為大量的Event進入而產生的一些問題,因為thread是固定的所以使用資源是可以預期的,因為如果同時間在一台機器上產生多個thead超過一個臨界點,效能會大幅度的降低.

    2010年3月19日 上午 12:34
  • 一般簡易的處理方式是,一個Event進來就產生一個thread來進行運算,但這種作法遇到當有瞬間大量Event同時產生時可能會導致系統崩潰,如果你的情況不會有此現象就不需要做處理,但通常很難預期不會發生.

    smartThreadPool的好處是,它本身並非是即時處理,它內部有個Queue,你可以指定smartThreadPool同時間可使用多少個thread,但Queue的數量超過thread的數量時,剩下的Event就會先暫存於Queue中等待.這樣做的好處是,不會因為大量的Event進入而產生的一些問題,因為thread是固定的所以使用資源是可以預期的,因為如果同時間在一台機器上產生多個thead超過一個臨界點,效能會大幅度的降低.


    那它跟 原本的ThreadPool  有什麼差別啊

    因為 我之前  也有用 Threadpool 去把要做的事情擺進去

    但效率沒有很明顯改善  ( 其實  我只是 很簡單的使用threadpool 並沒設定任何參數)

    你這講到SmartThreadPool 讓我有個方向感 

    只是  還是  不太瞭解  該怎麼去用  google查 只看到 大家都在說 這個東西不錯

    但  看原版的又一堆  觀念不是很清楚  若您方便 可以 大致說一下  這樣架構的一個作法跟可以改進的地方嘛

    2010年3月19日 上午 12:45
  • 兩者之差異可參考 http://www.yaosansi.com/post/1401.html

    我想你可能誤會我意思了,使用SmartThreadPool只是讓你在架構上比較好處理,並不是為了增快速度,因為你程式的瓶頸在於計算的class,如果class無法改善效能,那處理的方式不外乎1.增強電腦硬體 2.採用分散式運算.

    第1點是最簡單的方式,但限制也大.如果能用此方式解決問題,可以先採用.

    第2種作法較為複雜,我目前手邊有個系統專門在分析Log,平均每分鐘Log量約為數百筆,而每筆運算時間都需要1-5秒,故即使採用再好的機器也難處理,更不要說要盡可能達到即時.

    所以採用分散式運算是最好的方式我的整體程式架構如下

    1.Log Collector,負責蒐集Log,並依Process AP的Loading決定分派Log到哪台Process thread

    2.Process AP安裝於多台機器上,負責接收Log處理.

    整體架構大致如上,但中間細節很多,因為有相當多需要跨AP作通訊,技術上比較複雜.

    這種架構當User要求需要越即時時,增加Server就能達成需求.

     

     

    2010年3月19日 上午 01:11
  • 兩者之差異可參考 http://www.yaosansi.com/post/1401.html

    我想你可能誤會我意思了,使用SmartThreadPool只是讓你在架構上比較好處理,並不是為了增快速度,因為你程式的瓶頸在於計算的class,如果class無法改善效能,那處理的方式不外乎1.增強電腦硬體 2.採用分散式運算.

    第1點是最簡單的方式,但限制也大.如果能用此方式解決問題,可以先採用.

    第2種作法較為複雜,我目前手邊有個系統專門在分析Log,平均每分鐘Log量約為數百筆,而每筆運算時間都需要1-5秒,故即使採用再好的機器也難處理,更不要說要盡可能達到即時.

    所以採用分散式運算是最好的方式我的整體程式架構如下

    1.Log Collector,負責蒐集Log,並依Process AP的Loading決定分派Log到哪台Process thread

    2.Process AP安裝於多台機器上,負責接收Log處理.

    整體架構大致如上,但中間細節很多,因為有相當多需要跨AP作通訊,技術上比較複雜.

    這種架構當User要求需要越即時時,增加Server就能達成需求.

     

     


    嗯 謝謝

    其實  我的 AP 應該是不要用到 分散式的架構

    因為這樣 跨AP 跟電腦的問題  反而 失去了 我原本想單純處理的想法

    目前我大概的架構想法如下 請大家幫我看看

    1.  一開始Load  股票或權證進來時  因為  若用迴圈跑Load 基本資料 一定要跑個  三四十秒

        這時 我先將  每個 股票或權證 建立 class 計算部份 擺放在  SmartThreadpool 中去 等帶全部運算

        完畢

    2. 之後 就是  接收 股價 與 使用者 下單的Event了  因為  計算需要時間 股價進來又快 

        採取  Programlin 大大的講法 擺在 SmartThreadpool 中 去讓 處理方面  是可以 Control 的

        至於 要如何使用  SmartThreadPool  這點 我還在傷腦筋中  哈 

    3. DataGridView 的展示  就是從 SmartThreadPool 運算完的資料 進行更新 (這邊 會不會因為 某幾

        筆更新太頻繁造成  Datagridview 卡卡的  有經驗的人  可以幫忙一起討論嘛?!)

     

    2010年3月19日 上午 01:25
  • 只是個想法, 你可以參考一下

    因為我有看到你談到你那邊是有user side的

    我的話, 我會弄台database server, 收資料 下單的部分通通放到database 用 store procedure作掉(或是自己寫的code).

    Client端的話就會簡單很多, datagridview弄一個backgroundworker component就可以搞定了

    這樣就會把longterm jobs 放到兩個獨立的queue, 切割開會比較好作


    Robert in Taipei
    2010年4月13日 上午 03:23