主服务器向从服务器发送消息,如何保证消息一定到达,然后限制时间(如5s内)?

发布于 2022-09-04 19:55:02 字数 40 浏览 16 评论 0

上次面试一家java的公司面试的人问我的,如何保证可靠性和时间呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

沙与沫 2022-09-11 19:55:02

我想这个问题可能有点儿问题,问题要求,如何实现:“保证消息5秒内一定到达”,但这是一个不可能完成的任务,如果消息发出去的时候,网络中断了10秒。那你就是有逆天的本事,代码也没办法跨越虚空把数据发到另一台服务器啊。

所以,问题应该是:“将消息发送到从服务器,并且如果超过5秒,则放弃发送,保证超过5秒一定失败,而不会存在主服务器认为数据没有发送,而实际上从服务器却接收到了的情况”

如果问题是这样的话,我们可以这样做。
主服务器发送消息,并且等待从服务器的响应,就像http协议一样,请求和响应对应。
主服务器发送的消息里面包含消息发送时间,和消息的唯一ID。

主服务器发送数据,那么会有这么几种情况:

  • 收到从服务器的成功响应
  • 收到从服务器的失败响应,例如从服务器收到数据的时候,数据已经超过了5秒,所以拒绝处理。
  • 没有收到响应,例如网络中断

前两种情况我们都可以“确定”,第三种情况。我们可以重新发送这个请求。此时会出现这些情况

  • 收到从服务器的成功响应
  • 从服务器上次已经接收到请求了,所以这次返回成功
  • 收到从服务器的失败响应,例如从服务器收到数据的时候,数据已经超过了5秒,所以拒绝处理。
  • 没有收到响应,例如网络中断

前三种情况我们都可以“确定”

如果是第四种情况,那么我们继续发送,继续是上面4种结果。

就这样,我们就能保证消息一定发送成功,或者一定发送失败,而不会出现不知道消息发送成功没有的问题了。

季末如歌 2022-09-11 19:55:02

因素很多,没办法保证 5s 就能送达:

  • 网络断了,5s 能保证送达?

  • 服务器 Hang 了,收不到数据啊

  • 服务器挂了,收不到数据啊

  • 服务器忙的处理不过来,接受消息的线程一直得不到及时执行呢

只要服务能连通,甚至服务断了再连通,MQ 可以保证尽快的把消息送给消息接收者,但是具体时间就像上面说的,看服务能否访问以及服务处理的能力

吾性傲以野 2022-09-11 19:55:02

面试官可能是想问一下此类业务场景所能用的可靠性设计吧,我初步列几个:
1、为保证网络侧的安全性,在进程(服务)间增加心跳机制;
2、为保证服务器不宕机,可以采用自动化的运维系统去巡检,或者简单的第三方轮训ping也可以;
3、为保证进程不挂死,采用一些进程或者端口的轮训监控,随时拉起挂掉的进程;
4、要考虑传输层的可靠,那么可以采用TCP的协议,如果用ucp那么在非业务消息层增加重传机制;
5、每个消息报在设计的时候增加时间戳,当然服务器间的时钟要同步;利用时间戳监控延时;
6、在消息的业务层也增加ack机制,保证业务层确实收到并处理该消息;
7、也可以直接采用kafka等消息队列实现,为保证可靠性将kafka集群配置;

川水往事 2022-09-11 19:55:02

设置错误回调机制,超时回调,到达回调。或者用个MQ队列。

怎会甘心 2022-09-11 19:55:02

timeout 5s 逾期不候

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文