2010-03-06 121 views
1

我想知道,如果它是可能的,這行的集合插入後,啓動是異步執行的操作,是非阻塞的,並不需要通知請求的發起者 - 結果。Postgres的:郵政語句(或插入)異步非阻塞處理

我正在處理大量的事件,我可以保證後插入邏輯不會失敗 - 我只想在事件源中有一個插入線程,並且我希望這個線程繼續飛行沒有阻塞,並且不負責任何交付後的簿記。

我可以告訴你,我將可能有這些工作同時執行的100和每個作業可能會在每個表中插入200-1000之間的任何位置上的5臺操作。

提示正確的方向應該就夠了。

+0

你能告訴我你是如何解決這個問題的?通常這是一個任務,我會在oracle中使用dbms_job/schedule,但我在pg中缺少這個功能。所以我碰到這個非常老的線程有一個非常類似的問題... – christian 2011-07-26 09:50:12

+0

我正在寫我自己的數據處理引擎:D – 2011-07-28 13:13:14

+0

thx的信息。我現在使用dblink_send_query。但是我的「問題」是,我必須確保觸發觸發器的連接必須打開,直到每個dblink查詢完成。 – christian 2011-08-11 12:41:35

回答

-1

因爲實際上只是單純的批量處理大量行的,爲什麼不能讓一個cron作業後處理的行,當你與他們做了什麼?

只是將它們標記爲未加工(或重定向到一個觸發器的處理表),並同時處理它們時,即可大功告成。

+0

數據即將進入:/ – 2010-03-06 14:32:07

+0

如何創建一個cronjob來替換用於插入每個'n'分鐘的觸發器。 那麼你可以每隔n分鐘寫一個新表,並且在替換觸發器之後,你將處理前一個表並將其寫入實際的目標表。 – Wolph 2010-03-06 14:39:02

+0

這是一種可能性,我必須仔細考慮這一點 - 也許阻止來自客戶端,並直接寫入目標表,是一個更好的選擇。至少複雜性特徵將被很好地定義。 – 2010-03-06 14:47:22

2

LISTEN/NOTIFY可能是你需要什麼,有一個單獨的連接監聽器運行LISTEN notifyname(它可以使用非阻塞套接字和使用調查,或但您的應用程序的工作),以及你的代碼運行在處理之後通知NOTIFynam e,但是您需要一些方式讓您的LISTENing線程知道哪些記錄已完成,可能需要某種日誌表。另外值得注意的是,libpq支持asynchronous mode(至少支持DBD::Pg,推測其他Pg驅動程序也是如此)。

0

我會添加某種不同的答案。

你可以使用Redis的臨時存儲您的請求,然後就可以批量處理他們每X秒。 (至少你可以一次插入多行 - 通常你可以做更多...)。

也許是時間來檢查卡夫卡或亞馬遜的室壁運動。這是更先進的服務,可以讓您按照上面提到的做類似的事情。