2017-07-07 42 views
2

我在網上搜索,但我沒有找到任何解決方案,我的問題。 我使用laravel 5.2和SQS作爲隊列驅動程序。 我正在派遣一份工作,以便將電子郵件發送給100位用戶。 作業收到「文章」模型和「用戶」數組,並且每個用戶都應該收到帶有「文章」的電子郵件。Laravel工作大小限制已超過256kb(隊列SQS aws)

當它是10個用戶都可以。 當它是100個用戶時,我收到來自amazon SQS服務的錯誤消息「400錯誤請求」,並且響應是:「原因:消息必須小於262144字節。」 我明白這個工作的要求太大,因爲用戶的數組。

我想拆分用戶的數組,以便將作業的請求大小減少到小於256kb。 我可以通過循環遍歷用戶的數組來完成,每當我接近256kb時,我將派發一篇文章和用戶的工作,然後我將繼續運行數組中的其餘用戶。

  1. 什麼是檢查當前作業請求大小我們派遣之前的方式嗎?
  2. 您有更好的解決方案嗎?

非常感謝您提前 獅子座。

+0

有你派遣一個工作有100篇文章,而不是100個工作崗位的理由每篇有1篇文章?這首先是隊列系統的一大特點。 – CmdrSharp

+0

@CmdrSharp我正在發送一個包含100個項目的作業(1個EVENT和100個用戶),以減少隊列請求。每個EVENT將運行在用戶身上,並將發送EMAIL到100個用戶的相同(取決於條件),因此最終我將發送100個作業發送EMAIL。 SO 1 EVENT工作,100個用戶和100個工作崗位發送EMAILS。 – llioor

回答

1

我找到了問題的解決方案。 答案寫在文件:

因爲SerializesModels的特質作業使用,雄辯 車型將正常序列化,序列化時,工作是 處理。如果您的排隊作業在其構造函數 中接受了Eloquent模型,則只有模型的標識符將被序列化到隊列中的 。

這意味着laravel只保存序列化雄辯模型的id。像這樣,我們減少了派遣工作的大小。另一方面,在調度之前,我仍然不知道如何檢查作業的大小。

1

好的,您已經知道SerializesModels trait通過保存模型類和id,有助於保持有效負載的低,以便在作業解析時從數據庫中再次獲取。

如果它仍然使作業過大,隊列對象是在createObjectPayload方法中創建有效載荷的對象。它受到保護,因此您可能無法從外部輕鬆訪問它,但大部分有效負載僅爲serialize(clone $job)。這會讓你瞭解當前工作的規模。也許在工作類中創建一個方法,將用戶添加到其內部Eloquent \ Collection直到serialize($this)達到極限?


如果作業構造是

public function __construct(\Illuminate\Database\Eloquent\Collection $users, $maxSize) 
{ 
    $this->users = new \Illuminate\Database\Eloquent\Collection(); 

    while (strlen(serialize(clone $this)) < $maxSize) { 
     $this->users->push($users->shift()); 
    } 
} 

然後調用它像這樣:

// $usersToNotify is the collection with the users 

$job = new YourJob($usersToNotify, $maxSize); 

// Now the job has all users within the limit, 
// and $usersToNotify has the remaining users. 
+0

我不明白如何檢查「serialize($ this)」的大小,我怎麼知道在我派遣工作之前什麼時候達到256kb的限制?謝謝! – llioor

+0

嘿@alepeino strlen()不會返回「大小」,而是「長度」。對我來說,這仍然不是正確的答案。現在我通過將用戶數組拆分爲100個組來解決這個問題,如果我擁有100,000個用戶,則作業大小不會超過256kb,但我有1000個作業。主要問題是如何檢查請求的大小,然後我可以優化隊列中的作業數量。 – llioor

+0

@llioor等待,但不是作業的大小(主要是)它的有效載荷的大小,你得到的序列化?我在這裏錯過了什麼? – alepeino