【问题标题】:How to implement non-blocking tcp server with ack mechanism?如何使用 ack 机制实现非阻塞 tcp 服务器?
【发布时间】:2019-09-12 17:59:27
【问题描述】:

我是多线程 Web 服务器编程的新手 现在我正在编写一个服务器程序:

  1. 从tcp socket接收消息(自定义数据格式)
  2. 处理这些消息(这需要时间)
  3. 向套接字发送相应的响应
  4. 为接收消息和发送响应提供 ACK 机制,即每条消息都包含一个唯一的 seq 号,我应该在相应的响应中包含 ack(与 seq 相同)。对方也实现了这个机制。如果我在 5 分钟内没有收到对方的 ACK,我应该重新发送我希望收到相应 ACK 的消息。

我的想法是使用 while 循环从套接字接收消息,然后处理消息并发送响应。

问题是,处理消息需要时间,而且我可能会在短时间内收到多条消息。因此,如果我在这个 while 循环中调用 process_message() 函数并等待其完成,它将阻塞,我肯定会浪费时间。所以我需要非阻塞方式。

我做了一些研究。我想我可能会使用两种常见的技术:线程池和消息队列。

对于线程池,我的想法类似于下面的伪代码:

def process_message():
  process_message // takes time
  send_response(socket)

while True:
  message = recv(socket)
  thread = thread_pool.get_one()
  thread.start(target=process_message)

对于消息队列,我不确定,但我的想法是有生产者线程和消费者线程:

def consumer:
  // only one consumer thread?
  message = queue.poll()
  consumer_thread.process_message(message)
  send_response(socket)


while True:
  // only one producer thread?
  message = recv(socket)
  producer_thread.put_message_to_queue()

希望我的想法很清楚。谁能提供一些典型的解决方案?

那么,诡计多端的部分,关于如何实现 ACK 机制有什么想法吗?

谢谢!

【问题讨论】:

  • TCP是可靠的,为什么需要自己的ack机制?您可以使用选择超时。

标签: python multithreading tcp message-queue


【解决方案1】:

这是相当广泛的,因为还有太多要实现的。

总体思路确实是实现:

  • 一个 TCP 服务器,它将接收传入的消息并将它们(包括接收它们的套接字)写入队列中
  • 工作线程池,将从队列中获取消息、处理消息并将响应传递给负责发送消息并等待确认的对象
  • 一个对象,它将发送响应、存储序列号、套接字和消息,直到响应被确认。一个线程可以方便地处理等待确认的消息列表,并在超时用完时再次发送它们。

但是每个部分都需要相应的工作量,并且可以以不同的方式实现(selectTCPServer 或第一个处理接受的套接字的线程,哪个数据结构存储等待确认的消息的第三个,以及第二个是哪个池实现)。我做了一些测试,并意识到一个完整的答案将远远超出本网站的预期。恕我直言,您最好将问题分解为较小的可回答部分,并将其作为一般上下文。

您还应该说明收到的消息是否应在收到时立即确认,还是应在响应中隐含确认。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 2010-11-30
    • 2016-06-25
    • 1970-01-01
    • 2012-02-11
    • 2019-10-30
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多