获得指定行情分发节点的合约列表和订阅情况

来源:互联网 发布:招聘广告模板软件 编辑:程序博客网 时间:2024/04/30 01:33
h2. 需求


* 选择某个行情分发节点
* 查看该行情分发节点的合约列表和订阅情况
* 订阅和设置可交易合约可以将此类改动传播到其他行情节点


h2. 方案


* http_instruments 进程负责合约列表以及订阅情况
* http_instruments 进程需要和行情分发节点通过TCP通讯来获得对应的合约列表
* 页面增加按钮 “改动同步到其他节点”,下一步可以选择目标节点。


h2. 实现


* 合约处理进程 market_hub/instrument_handler
* 获取合约列表


  * 请求:  GET   /md/:id/instruments.json 
  * 响应(成功): [?INSTRUMENTS, {"data": [ {"id": 123, "code": "au1402", ....}, ..., {...} ] } ]  (websocket)
  * 响应(失败): [?INSTRUMENTS, {"error": "Msg"} ] (websocket)


* 订阅合约


 * 请求: PUT   /md/:id/instruments/subscribe.json   params: instrument_codes = ["au1412", "au1406", ...]   
 * 响应(成功): [?SUB_INSTRUMENTS, {“data”: [ ["au1402", ... ],  FailedList ] } ]  (websocket)
 * 响应(失败): [?SUB_INSTRUMENTS, {"error": "Msg"} ] (websocket)


* 设置可交易


 * 请求: PUT   /md/:id/instruments/enable_trading.json   params: instrument_codes = ["au1412", "au1406", ...]   
 * 响应(成功): [?ENABLE_TRADING, {“data”: [ ["au1402", ... ],  FailedList ] } ] (websocket)  

 * 响应(失败): [?ENABLE_TRADING, {"error": "Msg"}]  (websocket)



h2. 订阅,退订及设置可交易的请求与响应流程


* 发出TCP请求(订阅,退订,设置可交易)           market_auth/http_instrument:向market_dispatch发送TCP请求
* 接受TCP请求                              market_dispatch/market_dispatch_subscribe_handler:process_data 
* market_dispatch将请求发送给market_hub/instrument_handler(MarketHub从配置文件中读取)
  <pre>
  case Packet of %因为Packet只有sub_instruments和enable_trading,没法区分订阅和退订的区别,所以只写了两个接口
    {sub_instruments, ReqId, Access, Codes} ->
         rpc:call(MarketHub, instrument_handler, sub_instruments, [ReqId, Access, Codes, self()]);
    {enable_trading, ReqId, Access, Codes}
         rpc:call(MarketHub, instrument_handler, enable_trading, [ReqId, Access, Codes, self()])
  end
  </pre>    
* market_hub/instrument_handler 进行订阅,退订等操作(新增sub_instruments和enable_trading接口) 
  %因为消息种类只有sub_instruments和enable_trading,没法区分订阅和退订的区别,所以只写了两个接口
  <pre>
    sub_instruments(ReqId, Access, Codes, Pid) ->
       gen_server:cast(?SERVER, {sub_instruments, ReqId, Access, Codes, Pid}).
    enable_trading(ReqId, Access, Codes, Pid) ->
       gen_server:cast(?SERVER, {enable_trading, ReqId, Access, Codes, Pid}).
  </pre>
* market_hub/handle_cast返回信息给market_dispatcher(判断Pid是否为undefined,是则发给trade_gateway,否则发给market_dispatch) 
  <pre>
       Pid ! [[?RESP_OK, ToSubs], [?RESP_FAILED, fail_reason(FailSubs, insufficient_investor)]]
  或者  Pid ! [?RESP_FAILED, subscribe_instrument_failed] 
  </pre>
* market_dispatcher将响应信息处理成以下格式发送给market_auth/http_instrument
  <pre>
        Resp = [data, [ ["au1402", ... ], FailedList ] ]
    或者 Resp = [error, Msg]
    Action = ?SUB_INSTRUMENTS/?ENABLE_TRADING
    gen_tcp:send(Socket, packet:encode(Action, ?PLAIN, Resp))
  </pre>
* market_auth将数据转换成json后传给页面  
* 将其他调用market_hub/instrument_handler:handle_cast的地方加上Pid(undefined)这个参数

0 0
原创粉丝点击