【问题标题】:Distributed server model分布式服务器模型
【发布时间】:2012-05-03 22:39:21
【问题描述】:

假设我有 100 台服务器,每台服务器都运行一个守护进程——我们称之为 server——该服务器负责为该特定服务的每个用户生成一个线程(假设每台服务器有 1000 个线程)。每N 秒,每个线程都会执行something 并获取该特定用户的信息(此请求/响应模型无法更改)。我遇到的问题有时是线程挂起并停止执行某事。我需要一些方法来知道用户数据已经过时,需要刷新。

我唯一的想法是每隔5N 秒让线程更新与该用户关联的MySQL 记录(用户表中的last_scanned 列),另一个进程每隔15N 秒检查该表,如果last_scanned 列不是最新的,请重新启动线程。

【问题讨论】:

  • 当线程停止做某事时,这是预期的行为还是由于错误?
  • 由于错误 - 我应该指定线程挂起(是的,我还应该修复错误,这样一开始就不会发生这种情况,但让我们忽略它)

标签: python distributed-computing


【解决方案1】:

处理此问题的一般方法是让线程将其状态报告回服务器守护程序。如果您在过去 5N 秒内没有看到状态更新,那么您将终止该线程并启动另一个线程。

您可以在列表中跟踪当前已启动的活动线程,然后偶尔循环它们以确定状态。

您当然还应该修复程序中导致线程过早退出的错误。

过早退出和终止线程也可能使您的程序处于意外的非原子状态。您可能还应该让服务器守护进程运行一个清理进程,以确保队列中的任何项目,或您用来确定工作负载的任何项目,在一段时间不活动后重置。

【讨论】:

  • 这当然是一个更好的模型,但是如果服务器守护进程死了(断电、硬件故障等)会发生什么?我仍然觉得需要某种持久存储,所以如果服务器守护进程死了,它要么知道它所持有的用户,要么知道需要扫描的用户。
  • 我假设您已经有某种持久性存储来完成这项工作。通常人们会为这类事情使用队列。你可以看看 RabbitMQ。
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 2013-11-09
  • 2020-03-20
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2011-09-08
相关资源
最近更新 更多