请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于撮合服务重启的重新拉取委托单的问题,麻烦老师指点下

目前课程中对于packNo的判断代码如下:

private long lastPackNo = -1;

//NACK
long packNo = cmdPack.getPackNo();
if (packNo == lastPackNo + 1){

 }else if (packNo <= lastPackNo){

 }else {   
        //跳号
 }

lastPackNo 是放在内存中的,
如果撮合服务重启之后 lastPackNo 的值会 重新赋值为 -1,那么当收到udp广播的时候,新到的包的packNo与-1进行比对,必然会被识别为跳包了,就会重新拉取历史包,再次放入ringbuff中重新撮合,这里有两种情况:

情况1.重新拉取的这些委托包都是未被撮合的,这是ok的,可以重新进行撮合
情况2.重新拉取的这些委托包可能会包含(已经撮合过的和没有撮合的),因为lastPackNo =-1,造成重新拉取委托包,拉到了那些未被撮合的委托包,这种情况会再次重新撮合那些已经被撮合过的委托包

另外.如果不重新拉取的话,似乎又不知道哪些已经撮合过了哪些没有撮合,因为数据都在ringbuff内存里面,系统一重启ringbuff内存里面的东西都没有了。

以上问题我不知道实际生产环境中老师是怎么解决的,因此基于内存撮合,内存易失性问题会造成各种异常需要处理,比较麻烦

正在回答

插入代码

1回答

感谢你的提问,你的考虑是正确的,服务crash或者关闭会导致lastPackNo丢失,引发你说的这些问题,要解决内存易丢失的问题,就需要持久化orderbook和委托单的方案了,这个在课程后面的更新部分有展开介绍,可以往后看一看。

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信