主服务器向从服务器发送消息,如何保证消息一定到达,然后限制时间(如5s内)?
上次面试一家java的公司面试的人问我的,如何保证可靠性和时间呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
上次面试一家java的公司面试的人问我的,如何保证可靠性和时间呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
我想这个问题可能有点儿问题,问题要求,如何实现:“保证消息5秒内一定到达”,但这是一个不可能完成的任务,如果消息发出去的时候,网络中断了10秒。那你就是有逆天的本事,代码也没办法跨越虚空把数据发到另一台服务器啊。
所以,问题应该是:“将消息发送到从服务器,并且如果超过5秒,则放弃发送,保证超过5秒一定失败,而不会存在主服务器认为数据没有发送,而实际上从服务器却接收到了的情况”
如果问题是这样的话,我们可以这样做。
主服务器发送消息,并且等待从服务器的响应,就像http协议一样,请求和响应对应。
主服务器发送的消息里面包含消息发送时间,和消息的唯一ID。
主服务器发送数据,那么会有这么几种情况:
前两种情况我们都可以“确定”,第三种情况。我们可以重新发送这个请求。此时会出现这些情况
前三种情况我们都可以“确定”
如果是第四种情况,那么我们继续发送,继续是上面4种结果。
就这样,我们就能保证消息一定发送成功,或者一定发送失败,而不会出现不知道消息发送成功没有的问题了。
因素很多,没办法保证 5s 就能送达:
网络断了,5s 能保证送达?
服务器 Hang 了,收不到数据啊
服务器挂了,收不到数据啊
服务器忙的处理不过来,接受消息的线程一直得不到及时执行呢
只要服务能连通,甚至服务断了再连通,MQ 可以保证尽快的把消息送给消息接收者,但是具体时间就像上面说的,看服务能否访问以及服务处理的能力
面试官可能是想问一下此类业务场景所能用的可靠性设计吧,我初步列几个:
1、为保证网络侧的安全性,在进程(服务)间增加心跳机制;
2、为保证服务器不宕机,可以采用自动化的运维系统去巡检,或者简单的第三方轮训ping也可以;
3、为保证进程不挂死,采用一些进程或者端口的轮训监控,随时拉起挂掉的进程;
4、要考虑传输层的可靠,那么可以采用TCP的协议,如果用ucp那么在非业务消息层增加重传机制;
5、每个消息报在设计的时候增加时间戳,当然服务器间的时钟要同步;利用时间戳监控延时;
6、在消息的业务层也增加ack机制,保证业务层确实收到并处理该消息;
7、也可以直接采用kafka等消息队列实现,为保证可靠性将kafka集群配置;
设置错误回调机制,超时回调,到达回调。或者用个MQ队列。
timeout 5s 逾期不候