2012-04-20 71 views
2

我有一個Gearman隊列,它通過多個工作人員處理一些用戶特定的數據。我不希望特定用戶一次佔用超過一名工作人員。Gearman:限制工作人員根據一些輸入參數選擇作業

假設我有一個名爲process_user_data()的隊列,並且我運行了4名工作者W1,W2,W3,W4 當Userid 1提交10個作業時,我只想要W1處理它。 W2-W4不應該選擇這些工作。

這是否可以在gearman?

+0

我仍然在尋找這個答案。由於這個問題早已提交,目前有什麼方法可以在齒輪工中做到這一點? – user3288346 2015-11-25 09:15:05

回答

1

否Gearman不支持本地。我相信最簡單的方法是前綴/後綴的功能來表明他們屬於哪個用戶。例如:用戶1的工作應該提交給process_data_1(),工作人員1將接通該工作,而不是通用的process_data()。在內部,工人們仍然可以有相同的代碼庫,因爲這將是唯一的鉤到Gearman的服務器(通過命令行參數啓動的工人時,你可以管理)的問題:

class Worker 

public function __construct() { 
$this->user = argv[1]; 
$this->worker = new GearmanWorker(); 
$this->worker->addServer(); 
$this->worker->addFunction("process_data_" . $this->user, array($this, 'process_data')); 
} 

public function process_data() { 
//work code 
} 
} 
+0

感謝您的回覆。此解決方案可以工作,但似乎是一種解決方法。我會環顧其他隊列服務器。你能建議一個有持久性的隊列,並且有基於作業類型的過濾嗎? – Nands 2012-04-25 10:16:26

+0

不幸的是,我對其他隊列沒有太多經驗。 Beanstalkd擁有可以分配給用戶/工作人員的「管道」,但對我來說,這只是處理隊列的奇特方式。 RabbitMQ有「路線鑰匙」可能適合你的目的,但我從來沒有與他們合作,所以我不是100%確定。 – Aurimas 2012-04-26 10:51:17

+0

正如@Aurimas所建議的那樣,在RabbitMQ中路由密鑰可以允許你提出的問題,並且你也可以對匹配密鑰進行通配符。無論如何,我不會太快地跳過他/她的建議,這可能看起來像一個黑客,但它會很好地工作。 – MatsLindh 2012-04-30 20:27:58

0

如果工人在不同的服務器很容易 - 就是不與你的客戶GearmanClient->addServer()申報。如果在同一臺服務器上,我想你可以在一臺機器上的多個端口上運行多個gearmand實例。然後,您可以使用addServer(host, port)選擇性地聲明哪些「組」應該有機會被提供您即將添加的工作/任務。

如果這對你來說太亂了,那麼你可能需要選擇一個不同的排隊系統。我似乎記得閱讀Gearman不允許基於工作類型的過濾,但是我擔心我沒有這方面的參考。也許看看RabbitMQ或BeanStalk?