我从套接字读取时遇到问题。有一个星号实例运行大量的呼叫(一分钟10-60),我正在尝试读取和处理与这些呼叫相关的CDR事件(连接到AMI)。
这是我正在使用的库(不是我的,但因为错误而被推到了分叉)https://github.com/warik/gami
它非常直接,主要的行动在gami.go - readDispatcher。
buf := make([]byte, _READ_BUF) // read buffer
for {
rc, err := (*a.conn).Read(buf)
所以,有TCPConn(a.conn)和大小为1024的缓冲区,我正在从socket读取消息。到目前为止一直很好,但最终,不时(这个时间可能从10分钟变化到5个小时,与通过套接字的数据量无关)读取操作失败并出现io.EOF错误。我试图立即重新连接和重新连接,但它也不可能 - 连接超时,所以我被迫等待大约40-60秒,这次对我来说非常关键,因为延迟我丢失了大量数据。我在谷歌上搜索,阅读消息来源并尝试了很多东西 - 没什么。最奇怪的是,在python或php中打开的简单套接字不会失败。
go go go1.2.1 linux / amd64
asterisk 1.8
答案 0 :(得分:1)
更新到最新的星号。当AMI发送大量数据时,有类似的错误。
对于检查问题,您可以通过ami命令发送“COMMAND sip show peers”(或任何其他长输出命令)并查看结果。
答案 1 :(得分:1)
好的,问题在于OS套接字缓冲区溢出。如图所示,需要处理的数据很多。
那么,有三种可能的解决方法:
gami默认从星号读取所有数据的东西。我正在阅读所有这些并在实际读取操作后过滤它们。根据AMI监听应用程序在相当差的PC上运行,它似乎无法在缓冲容量暴露之前读取所有数据。但是它可能只接收特定事件,通过向AMI发送“事件”动作并指定所需的“EventMask” ”。 所以,我的决定是这样做的。并为不同的事件类型创建不同的连接。