- 主题:求个思路 多谢了
求个思路或逻辑
目前做一个udp协议的超时监控,比如发起A,响应是B、C、D、E
服务端接收到A后30秒内收到BCDE就OK,超过30秒则告警
服务端接收到的数据还没有顺序发送的是ab可能收到ba
也有可能是aaab这样的也要考虑进去
我目前做的思路是收到发起消息时放到redis中,
收到响应消息时删除key
程序监听 redis expired事件, 当收到事件消息时,说明肯定是超时了
因为收到的包是无序的,所以人为的把响应消息给sleep了,阻断了,这样强制他有序了
虽然这样免强还能用,但是有误报,比如可能因网络问题收到的是AAAB,连续发了几个请求,但在30秒内还是有响应,不应该告警
我现在这种情况就会告警
而且人为sleep这种方式我觉得很low
但又想不出其它的,还忘各位高手指点
--
FROM 221.219.191.*
消息体里带上消息发送时的时间戳?
【 在 rogue 的大作中提到: 】
: 求个思路或逻辑
: 目前做一个udp协议的超时监控,比如发起A,响应是B、C、D、E
: 服务端接收到A后30秒内收到BCDE就OK,超过30秒则告警
: 服务端接收到的数据还没有顺序发送的是ab可能收到ba
: 也有可能是aaab这样的也要考虑进去
:
: 我目前做的思路是
: ..................
发自「今日水木 on Redmi K30 5G」
--
FROM 117.152.72.*
对每个A消息起个协程就行
每个携程里,当收到A对应的BCDE并处理以后就结束,否则到30秒也结束但是报错
至于aaab这种情况,我觉得你这个协议本身就有点乱,应该怎么处理你自己好好规划一下
【 在 rogue 的大作中提到: 】
: 标 题: 求个思路 多谢了
: 发信站: 水木社区 (Sun Feb 26 11:24:54 2023), 站内
:
: 求个思路或逻辑
: 目前做一个udp协议的超时监控,比如发起A,响应是B、C、D、E
: 服务端接收到A后30秒内收到BCDE就OK,超过30秒则告警
: 服务端接收到的数据还没有顺序发送的是ab可能收到ba
: 也有可能是aaab这样的也要考虑进去
:
: 我目前做的思路是收到发起消息时放到redis中,
: 收到响应消息时删除key
: 程序监听 redis expired事件, 当收到事件消息时,说明肯定是超时了
:
: 因为收到的包是无序的,所以人为的把响应消息给sleep了,阻断了,这样强制他有序了
:
: 虽然这样免强还能用,但是有误报,比如可能因网络问题收到的是AAAB,连续发了几个请求,但在30秒内还是有响应,不应该告警
: 我现在这种情况就会告警
: 而且人为sleep这种方式我觉得很low
:
: 但又想不出其它的,还忘各位高手指点
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 221.219.191.*]
--
修改:Knightmare FROM 124.126.150.*
FROM 124.126.150.*
你自己的需求就不明确啊
AAAB,这个B是对应哪个A的,是回一个B所有的A就都没超时?
【 在 rogue 的大作中提到: 】
: 求个思路或逻辑
: 目前做一个udp协议的超时监控,比如发起A,响应是B、C、D、E
: 服务端接收到A后30秒内收到BCDE就OK,超过30秒则告警
: ...................
--
FROM 221.217.52.*
sip协议
【 在 Knightmare 的大作中提到: 】
: 对每个A消息起个协程就行
: 每个携程里,当收到A对应的BCDE并处理以后就结束,否则到30秒也结束但是报错
: 至于aaab这种情况,我觉得你这个协议本身就有点乱,应该怎么处理你自己好好规划一下
: ...................
--
FROM 221.219.191.*
sip协议
a是invite
发两个invite 可能是因为网络原因重发
b是100trying 回了就OK
【 在 wincss 的大作中提到: 】
: 你自己的需求就不明确啊
: AAAB,这个B是对应哪个A的,是回一个B所有的A就都没超时?
--
FROM 221.219.191.*
if (收到A){
// 设置超时时间为30秒
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
select {
case <-ctx.Done():
fmt.Println("响应超时")
case <-B:
fmt.Println("ok")
}
}
先B后A也算有响应吗? 你的描述实在是太不清楚了。
【 在 rogue 的大作中提到: 】
: 求个思路或逻辑
: 目前做一个udp协议的超时监控,比如发起A,响应是B、C、D、E
: 服务端接收到A后30秒内收到BCDE就OK,超过30秒则告警
: ...................
--
FROM 221.219.99.*
我都不知道怎么描述了,看下sip协议就好了,怕直接写协议中的方法涉及不到的人会看不懂,就用abc了,协议是udp的所以接受到的是随机顺序
【 在 ilylx 的大作中提到: 】
:
: if (收到A){
: // 设置超时时间为30秒
: ctx, cancel : = context.WithTimeout(context.Background(), 30*time.Second)
: select {
: case <-ctx.Done():
:
: ..................
发自「今日水木 on iPhone 11」
--
FROM 221.219.191.*
使用一个简单的链表数组,每个记录包含接受到的信息和接收时间,链表按照接受时间排序。
接收到任意事件之后,链表从后向前先检查前面30秒内是否有能够满足条件的解答,同时删除30秒前面的数据回收空间。
其实你的工作就类似于TCP congestion control。当然也可以不用链表用其他的数据结构。
--
FROM 183.192.10.*
【 在 rogue 的大作中提到: 】
: sip协议
: a是invite
: 发两个invite 可能是因为网络原因重发
: ...................
可以参考 开源项目 gosip 和 开源项目 kalbi。这2个项目都是用Go实现sip协议。
--
FROM 174.112.61.*