我正在为我工作的办公室开发内部电话系统软件。我们很高兴使用 Twilio 来管理我们的电话树 - 但希望创建一种更好的方法来监控来电并在来电者与我们的一个人建立联系后转接来电。
我们处于混合(Windows 和 Mac)环境中,因此我选择使用 Python 运行来编写此应用程序的桌面部分。我(在大多数情况下)仍处于该项目的笔和纸阶段。我有一些 Python/TKinter 经验和一些 TCP Socket 经验(使用 CakePHP,而不是 Python),并且对如何管理我们的服务器(向 Twilio 发出命令)和客户端应用程序之间的数据包传输有一些疑问。
客户端应用程序将向用户显示呼叫队列中的呼叫者数量,并允许用户在他们的电话上接受呼叫,以及将呼叫者发送回队列(或另一个代理)。以下是我考虑过的两种方法:
方法一
客户端 (Python) 应用程序监听来自我们 VPS 的 TCP 连接。这将是最少的内存密集型,但是阅读了这篇关于 buff-sizes 的帖子,特别是
关于:“如果您有一个确切知道传入数据包长度的协议,显然最好只读取“最多”您正在处理的数据包所需的内容,否则您可能会吃掉下一个数据包那会很烦人。”
这对于应用程序开发人员可能更可取,但对于底层网络堆栈可能效率低下。首先,它占用了可用于额外网络 I/O 的套接字缓冲区空间。其次,您所做的每个 recv() 都意味着进入系统调用/内核空间,并且转换会降低性能。始终最好使用尽可能少的系统调用从内核空间获取尽可能多的数据并进入用户空间,并在那里进行消息解析。这增加了应用程序代码和消息处理的复杂性,但可能是最有效的。
我真的很矛盾——吃下一包是一回事吗?我怎样才能预测增益大小或我需要?
方法二
我可以让应用程序每秒钟查询一次“联合状态” n
。但这似乎很浪费。
什么是正确答案。有什么我想念的吗?