所以我正在嘗試使用帶有 fluentd 的 unix sockets 進行日志記錄任務并隨機發(fā)現(xiàn),偶爾會出現(xiàn)錯誤撥號:{socket_name} 資源暫時不可用關(guān)于為什么會發(fā)生這種情況的任何想法?我嘗試添加“重試”邏輯以減少錯誤,但有時仍會發(fā)生。另外,對于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條經(jīng)驗 獲得超5個贊
Go 以非阻塞模式創(chuàng)建它的套接字,這意味著某些通常會阻塞的系統(tǒng)調(diào)用。在大多數(shù)情況下,它EAGAIN
通過等待套接字準備好讀/寫來透明地處理錯誤(由“資源暫時不可用”消息指示的內(nèi)容)。不過,它似乎沒有這種connect
調(diào)用邏輯Dial
。
如果偵聽隊列已滿,則在連接到 UNIX 域套接字時可能connect
會返回EAGAIN
。如果客戶端連接到它的速度比它接受它們的速度快,就會發(fā)生這種情況。在這種情況下,Go 可能應該等待套接字,直到它變得可連接,然后重試類似于它對Read
/所做的事情Write
,但它似乎沒有這種邏輯。
所以你最好的辦法是通過等待和重試Dial
調(diào)用來處理錯誤。那,或者找出您的服務器不及時接受連接的原因。
- 2 回答
- 0 關(guān)注
- 362 瀏覽
添加回答
舉報
0/150
提交
取消