alibaba / tengine

A distribution of Nginx with some advanced features
https://tengine.taobao.org
BSD 2-Clause "Simplified" License
12.65k stars 2.52k forks source link

tengine xquic 如何实现被lvs的 udp的健康检查探测到 #1917

Closed longmaythesunshine-zx closed 4 months ago

longmaythesunshine-zx commented 4 months ago

我们接入架构是 lvs + tengine。lvs 会定期像tengine发送几个udp报文,需要tengine回复指定报文udp才认为健康。但实际使用中xquic会认为这是个错误请求,tengine不会返回任何数据,导致tengine节点会被认为一直不可用。不知道有没有什么方案解决?

lianglli commented 4 months ago

define NGX_XQUIC_HEALTH_CHECK_REQ "UDPSTATUS"

define NGX_XQUIC_HEALTH_CHECK_RSP "UDPOK"

请求报文含magic string "UDPSTATUS",tengine会回包"UDPOK"

image

image

longmaythesunshine-zx commented 4 months ago

感谢解答~ 我发现我们健康检查的探测报文并不能通过。看了下ngx_xquic_recv.c中 会对udp报文做一个简单的头检测 ` / check QUIC magic bit / if (!NGX_XQUIC_CHECK_MAGIC_BIT(packet->buf)) { ngx_log_error(NGX_LOG_WARN, c->log, 0, "|xquic|invalid packet head|"); return; }

define NGX_XQUIC_CHECK_MAGIC_BIT(pos) (((*(pos)) & 0x40) == 0x40)

` 看起来是需要第一个字符的第二个二进制位是1才行。我看字母都是在这个区间,但是数字不行,我测试了一下也确实如此。

不知道咱们后续有没有考虑优化这块健康检查逻辑?在头检测前先进行healcheck? 以及后续将健康检查报文配置化?这样方便我们自定义配置~