2015-05-07 83 views
2

我想使用芹菜消費亞馬遜在SQS上交付的S3事件。但是,S3 message format不匹配what Celery expects芹菜與亞馬遜SQS和S3事件

如何以最少的詭計消費這些消息?我應該寫一個自定義序列化程序嗎?我應該放棄並使用boto或boto3製作自定義橋樑嗎?

作爲一個旁註,我還希望將Celery連接到不同的代理(RabbitMQ)以獲取應用程序消息的其他部分(如果有的話)。

+0

您鏈接到由芹菜內部使用,以傳達給工人要運行的任務,以及參數傳遞給它的芹菜消息格式。您鏈接的S3消息格式是讓您瞭解影響S3對象的事件。談論將它們直接連接在一起是沒有意義的 - 這就像問你是否可以將電線連接到水管以製造電淋浴器一樣。你需要中間的一些機器來做一些處理。你想在這裏做什麼?當通知S3事件時,建立一個可以做一些工作(使用芹菜工作者)的系統? – scytale

+0

@scytale準確。傻瓜的差事? – w00t

+0

nope。合理的問題。 – scytale

回答

1

對於我的具體使用情況,最容易創建一個橋樑工作人員輪詢SQS並使用默認代理向Celery提供任務。

不難做到(雖然boto和SQS可以使用更多的文檔),而且Celery不太適合同時連接兩個不同的經紀人,所以感覺是最好的方式。

3

您將需要創建一個服務來偵聽S3通知,然後運行相應的芹菜任務。

您有多種選擇--S3通知通過SQS,SNS或AWS Lambda發佈。

事實上,最簡單的選擇可能是根本不使用Celery,只需編寫一些代碼在AWS Lambda中運行即可。我沒有使用過這個服務(Lambda是相對較新的),但它看起來像是你不需要運行監控服務或芹菜工人。

+0

Lambda是我的第一個想法,但後來我擔心必須處理在Lambda中運行的代碼的生命週期,以及如何爲RabbitMQ獲取身份驗證令牌。 – w00t

1

配置AWS S3事件以調用AWS Lambda函數。該函數應寫入將S3事件消息轉換爲Celery消息格式,然後將Celery消息發佈到SQS。芹菜會收到SQS的消息。

S3事件 - > LAMBDA - > SQS - >芹菜

+0

我嘗試過這個結構,但是在引用[here](https://groups.google.com/forum/#!topic/celery-users/gE5irkuLVj0)後使用的消息格式給出了TypeError:dispatch()至少有兩個參數(1給出)'與海帶。你有沒有實現這個?謝謝你的幫助。 – akhilsp

+1

是的。這是一個python實現。 https://gist.github.com/rhockenbury/74d176691a4d9e2a84f64cb314910fc6請注意,我已經使用了v1任務消息協議,但Kombu會檢測到這個並將其解析爲v2。 http://docs.celeryproject.org/en/latest/internals/protocol.html –

+0

謝謝,這對我很好。 – akhilsp