所以我正在尝试使用带有 fluentd 的 unix sockets 进行日志记录任务并随机发现,偶尔会出现错误拨号:{socket_name} 资源暂时不可用关于为什么会发生这种情况的任何想法?我尝试添加“重试”逻辑以减少错误,但有时仍会发生。另外,对于fluntd,我们使用unix sockets通信的默认配置func connect() {var connection net.Connvar err errorfor i := 0; i < retry_count; i++ { connection, err = net.Dial("unix", path_to_socket) if err == nil { break } time.Sleep(time.Duration(math.Exp2(float64(retry_count))) * time.Millisecond)}if err != nil { fmt.Println(err)} else { connection.Write(data_to_send_socket) } defer connection.Close()}
2 回答
心有法竹
TA贡献1866条经验 获得超5个赞
Go 以非阻塞模式创建它的套接字,这意味着某些通常会阻塞的系统调用。在大多数情况下,它EAGAIN
通过等待套接字准备好读/写来透明地处理错误(由“资源暂时不可用”消息指示的内容)。不过,它似乎没有这种connect
调用逻辑Dial
。
如果侦听队列已满,则在连接到 UNIX 域套接字时可能connect
会返回EAGAIN
。如果客户端连接到它的速度比它接受它们的速度快,就会发生这种情况。在这种情况下,Go 可能应该等待套接字,直到它变得可连接,然后重试类似于它对Read
/所做的事情Write
,但它似乎没有这种逻辑。
所以你最好的办法是通过等待和重试Dial
调用来处理错误。那,或者找出您的服务器不及时接受连接的原因。
- 2 回答
- 0 关注
- 338 浏览
添加回答
举报
0/150
提交
取消