PostgreSQL:LISTEN | NOTIFY
pg 中的 Listen/Notify 是用來提供客戶端之間透過服務段進行訊息通訊的機制。
-
listen:監聽訊息通道
-
unlisten:取消先前的監聽
-
notify:傳送訊息到訊息通道中
-
pg_notify():與 notify 命令的功能相同,也可以傳送訊息到訊息同道中。
-
pg_listening_channels():呼叫此函式可以查詢當前 session 已註冊了哪些訊息監聽。
LISTEN
LISTEN channel (channel值任意)
-
用來註冊一個訊息通道。
-
如果在事務中執行 listen,那麼事務必須成功 commit,listen才生效。
-
session 退出後 listen 自動釋放。
NOTIFY
NOTIFY channel [, payload] (payload預設要求小於8000位元組, 且必須是常量) -- OR pg_notify(channel, payload)
-
用來往訊息通道傳送非同步訊息。
-
如果在事務中執行 notify,那麼必須等事務成功 commit 之後這個訊息才會塞進訊息佇列。
-
訊息在事務和事務之間的間隙傳遞。因此如果有一個 listen 的 session 中跑了一個很長的事務,那麼要等這個事務結束才能接收到這個過程中發出的 notify。
-
一個訊息如果在發出 notify 之前有監聽者,必須等這些監聽者都接收到了這個訊息才從訊息佇列中去除。
UNLISTEN
UNLISTEN { channel | *)}
註冊訊息監聽後,如果不想再收到相應的訊息,可以使用 UNLISTEN 取消監聽。UNLISTEN * 可以取消所有監聽的註冊,在會話結束是也會自動執行這個命令。
示例
通用場景
多個 session 可以同時監聽同一個訊息通道。當傳送端傳送一個訊息時,所有監聽者都可能收到此訊息。
-- session 1 postgresql > listen test -- session 2 postgresql > listen test -- session 3 postgresql > notify test, 'hello world'; -- session 1 postgresql > select 1; -- session 2 postgresql > select 1;
回滾場景
如果在事務中呼叫 notify 傳送訊息,實際訊息要在事務提交時才會被髮送,如果事務回滾了,訊息將不會傳送
-- session 1 postgresql > listen test -- session 2 postgresql > begin; postgresql > notify test, 'hello world'; -- session 1 postgresql > select 1; -- session 2 postgresql > begin; postgresql > notify test, 'hello world'; postgresql > end; -- session 1 postgresql > select 1;
相同訊息
如果在一個事務中傳送兩條訊息的通道名稱相同,訊息字串也完全相同,則實際上只有一條訊息傳送出去
-- session 1 postgresql > listen test -- session 2 postgresql > notify test, 'hello world1'; postgresql > notify test, 'hello world1'; postgresql > notify test, 'hello world2'; -- session 1 postgresql > select 1;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2743682/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL流式處理應用實踐-二手商品實時歸類(非同步訊息notify/listen、閱後即焚)SQL非同步
- nginx listen指令淺析之add listenNginx
- listen優化優化
- nginx的listen指令解析Nginx
- Listen 1音樂播放器播放器
- windows redis sentinel listen: Unknown error解決方案WindowsRedisError
- listen EACCES: permission denied 0.0.0.0:9520 at Server.setupListenHandleServer
- 語音識別2 -- Listen,Attend,and Spell (LAS)
- Java-併發-wait()、notify()和notifyAll()JavaAI
- Java 中的 Wait 和 Notify 機制JavaAI
- 併發-6-wait、notify、Semaphore、CountDownLatch、CyclicBarrierAICountDownLatch
- Java常用的三個方法 `wait ` `notify` `notifyAll`JavaAI
- 併發程式設計之Wait和Notify程式設計AI
- Arm-Linux子系統的互相NotifyLinux
- nginx對listen埠的處理 -- 第二篇Nginx
- 併發程式設計之 wait notify 方法剖析程式設計AI
- java多執行緒 wait() notify()簡單使用Java執行緒AI
- Java併發(二十一)----wait notify介紹JavaAI
- 執行緒篇2:[- sleep、wait、notify、join、yield -]執行緒AI
- nginx對listen埠的優化 -- 第一篇Nginx優化
- listen原始碼分析第一篇 address:port分析原始碼
- Listen1 Mac付費音樂免費聽神器Mac
- The Tomcat connector configured to listen on port 80 failed to start. The port may already be inTomcatAI
- Nuxt.js 應用中的 listen 事件鉤子詳解UXJS事件
- 想要暢聽全網音樂?試試 Listen1吧!
- Java 非同步程式設計之:notify 和 wait 用法Java非同步程式設計AI
- JVM原始碼分析之Object.wait/notify實現JVM原始碼ObjectAI
- Java多執行緒 -- wait() 和 notify() 使用入門Java執行緒AI
- java併發程式設計系列:wait/notify機制Java程式設計AI
- 從Linux原始碼看Socket(TCP)的listen及連線佇列Linux原始碼TCP佇列
- Java多執行緒中wait 和 notify 方法理解Java執行緒AI
- 啃碎併發(八):深入分析wait¬ify原理AI
- gnome-shell 使用 notify-send 傳送桌面訊息
- 一個關於wait/notify與鎖關係的探究AI
- 執行緒安全(三個條件)Synchronzied,wait和notify執行緒AI
- Java多執行緒中的wait/notify通訊模式Java執行緒AI模式
- PostgreSQL DBA(45) - Hypothetical Indexes in PostgreSQLSQLIndex
- Listen1 - 讓你暢享全網音樂!你值得擁有!