* 选择某个行情分发节点
* 查看该行情分发节点的合约列表和订阅情况
* 订阅和设置可交易合约可以将此类改动传播到其他行情节点
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)这个参数