NOTIFY
NOTIFY â ÑгенеÑиÑоваÑÑ Ñведомление
СинÑакÑиÑ
NOTIFYканал[ ,ÑообÑение]
ÐпиÑание
Ðоманда NOTIFY оÑпÑавлÑÐµÑ ÑобÑÑие ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑÑе Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной ÑÑÑокой «ÑообÑениÑ» вÑем клиенÑÑким пÑиложениÑм, коÑоÑÑе до ÑÑого вÑполнили в ÑекÑÑей базе даннÑÑ
LISTEN Ñ ÑказаннÑм именем канала. Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ñ Ð²Ñем полÑзоваÑелÑм.канал
NOTIFY пÑедоÑÑавлÑÐµÑ Ð¿ÑоÑÑой меÑ
анизм межпÑоÑеÑÑного взаимодейÑÑÐ²Ð¸Ñ Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва пÑоÑеÑÑов, ÑабоÑаÑÑиÑ
Ñ Ð¾Ð´Ð½Ð¾Ð¹ базой даннÑÑ
Postgres Pro. ÐмеÑÑе Ñ Ñведомлением Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑедана ÑÑÑока ÑообÑениÑ, а пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе ÑеÑез ÑаблиÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, можно ÑоздаÑÑ Ð±Ð¾Ð»ÐµÐµ вÑÑокоÑÑовневÑе меÑ
Ð°Ð½Ð¸Ð·Ð¼Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ÑÑÑÑкÑÑÑиÑованнÑми даннÑми.
ÐнÑоÑмаÑиÑ, пеÑÐµÐ´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ñ Ñведомлением, вклÑÑÐ°ÐµÑ Ð¸Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð° Ñведомлений, PID ÑеÑвеÑного пÑоÑеÑÑа, ÑпÑавлÑÑÑего ÑеанÑом, коÑоÑÑй вÑдал Ñведомление, и ÑÑÑÐ¾ÐºÑ ÑообÑÐµÐ½Ð¸Ñ (она бÑÐ´ÐµÑ Ð¿ÑÑÑой, еÑли ÑообÑение не задано).
ÐÑÐ±Ð¾Ñ Ð¿Ð¾Ð´Ñ
одÑÑиÑ
имÑн каналов и иÑ
назнаÑÐµÐ½Ð¸Ñ â дело пÑоекÑиÑовÑика Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐбÑÑно Ð¸Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð° ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ какой-либо ÑаблиÑÑ Ð² базе, а ÑобÑÑие ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑÑÑи ознаÑÐ°ÐµÑ Â«Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð»Ð° ÑÑÑ ÑаблиÑÑ, поÑмоÑÑиÑе, ÑÑо она ÑодеÑÐ¶Ð¸Ñ ÑепеÑÑ». Ðднако ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ NOTIFY и LISTEN не навÑзÑваÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ Ñакой подÑ
од. ÐапÑимеÑ, пÑоекÑиÑовÑик Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑазнÑе имена каналов, ÑÑÐ¾Ð±Ñ ÑигнализиÑоваÑÑ Ð¾ ÑазнÑÑ
ÑипаÑ
изменений в одной ÑаблиÑе. ÐÑоме Ñого, ÑÑÑÐ¾ÐºÑ ÑообÑÐµÐ½Ð¸Ñ Ñоже можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑазлиÑнÑÑ
ÑобÑÑий.
ÐÑли ÑÑебÑеÑÑÑ ÑигнализиÑоваÑÑ Ð¾ ÑакÑе изменений в опÑеделÑнной ÑаблиÑе, иÑполÑзÑÑ NOTIFY, можно пÑимениÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñй пÑогÑаммнÑй пÑиÑм â помеÑÑиÑÑ NOTIFY в ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа, коÑоÑÑй бÑÐ´ÐµÑ ÑÑабаÑÑваÑÑ Ð¿Ñи изменениÑÑ
в ÑаблиÑе. ÐÑи Ñаком подÑ
оде Ñведомление бÑÐ´ÐµÑ Ð²ÑдаваÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки, Ñак ÑÑо пÑикладной пÑогÑаммиÑÑ Ð½Ðµ ÑиÑкÑÐµÑ ÑлÑÑайно оÑÑавиÑÑ ÐºÐ°ÐºÐ¾Ðµ-либо изменение без ÑведомлениÑ.
ТÑанзакÑии оказÑваÑÑ Ð·Ð½Ð°ÑиÑелÑное влиÑние на ÑабоÑÑ NOTIFY. Ðо-пеÑвÑÑ
, еÑли NOTIFY вÑполнÑеÑÑÑ Ð²Ð½ÑÑÑи ÑÑанзакÑии, ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑавлÑÑÑÑÑ Ð¿Ð¾Ð»ÑÑаÑелÑм поÑле ÑикÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑанзакÑии и ÑолÑко в ÑÑом ÑлÑÑае. ÐÑо ÑазÑмно, Ñак как в ÑлÑÑае пÑеÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑанзакÑии дейÑÑвие вÑеÑ
команд в ней аннÑлиÑÑеÑÑÑ, вклÑÑÐ°Ñ NOTIFY. Ðднако ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÐµÑкÑÑажиÑÑ ÑеÑ
, кÑо ожидаеÑ, ÑÑо ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¿ÑиÑ
одиÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾. Ðо-вÑоÑÑÑ
, еÑли ожидаÑÑий ÑÐµÐ°Ð½Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ñведомление внÑÑÑи ÑÑанзакÑии, ÑÑо ÑобÑÑие не бÑÐ´ÐµÑ Ð´Ð¾ÑÑавлено подклÑÑÑÐ½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ (ÑикÑаÑии или оÑкаÑа) ÑÑанзакÑии. ÐÑо опÑÑÑ Ð¶Ðµ обÑÑÑнÑеÑÑÑ Ñем, ÑÑо еÑли Ñведомление бÑÐ´ÐµÑ Ð´Ð¾ÑÑавлено в ÑамкаÑ
ÑÑанзакÑии, коÑоÑÐ°Ñ Ð·Ð°Ñем бÑÐ´ÐµÑ Ð¿ÑеÑвана, Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ как-Ñо оÑмениÑÑ ÐµÐ³Ð¾ â но ÑеÑÐ²ÐµÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Â«Ð·Ð°Ð±ÑаÑÑ Ð½Ð°Ð·Ð°Ð´Â» Ñведомление поÑле Ñого, как оно бÑло оÑпÑавлено клиенÑÑ. ÐоÑÑÐ¾Ð¼Ñ ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑавлÑÑÑÑÑ ÑолÑко Ð¼ÐµÐ¶Ð´Ñ ÑÑанзакÑиÑми. УÑиÑÑÐ²Ð°Ñ Ð²ÑÑеÑказанное, в пÑиложениÑÑ
, пÑименÑÑÑиÑ
NOTIFY Ð´Ð»Ñ ÑигнализаÑии в ÑеалÑном вÑемени, ÑледÑÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð¸Ð·Ð¸ÑоваÑÑ ÑÐ°Ð·Ð¼ÐµÑ ÑÑанзакÑий.
ÐÑли в ÑамкаÑ
одной ÑÑанзакÑии в один канал поÑÑÑпило неÑколÑко Ñведомлений Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм ÑообÑением, ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑеÑиÑÑ Ð´Ð¾ÑÑавиÑÑ ÑолÑко одно Ñведомление. ÐÑли же ÑообÑÐµÐ½Ð¸Ñ ÑазлиÑаÑÑÑÑ, ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð²Ñегда доÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¿Ð¾ оÑделÑноÑÑи. Так же ÑведомлениÑ, поÑÑÑпаÑÑие Ð¾Ñ ÑазнÑÑ
ÑÑанзакÑий, никогда не бÑдÑÑ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ñ Ð² одно. Ðе ÑÑиÑÐ°Ñ ÑилÑÑÑаÑии поÑледÑÑÑиÑ
ÑкземплÑÑов дÑблиÑÑÑÑиÑ
ÑÑ Ñведомлений, NOTIFY гаÑанÑиÑÑеÑ, ÑÑо ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑанзакÑии вÑегда поÑÑÑпаÑÑ Ð² Ñом же поÑÑдке, в каком бÑли оÑпÑавленÑ. Также гаÑанÑиÑÑеÑÑÑ, ÑÑо ÑообÑÐµÐ½Ð¸Ñ Ð¾Ñ ÑазнÑÑ
ÑÑанзакÑий поÑÑÑпаÑÑ Ð² поÑÑдке ÑикÑаÑии ÑÑиÑ
ÑÑанзакÑий.
ЧаÑÑо бÑваеÑ, ÑÑо клиенÑ, вÑполнивÑий NOTIFY, Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½Ð° ÑÑом же канале. Ð ÑÑом ÑлÑÑае он полÑÑÐ¸Ñ ÑÐ²Ð¾Ñ Ð¶Ðµ Ñведомление, как и лÑбой дÑÑгой ÑеанÑ, ожидаÑÑий ÑведомлениÑ. РзавиÑимоÑÑи Ð¾Ñ Ð»Ð¾Ð³Ð¸ÐºÐ¸ пÑиложениÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к беÑÑмÑÑленнÑм опеÑаÑиÑм, напÑимеÑ, поиÑÐºÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в ÑаблиÑе, коÑоÑÑе и бÑли внеÑÐµÐ½Ñ ÑÑим же ÑеанÑом. ÐÑой дополниÑелÑной ÑабоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ избежаÑÑ, еÑли пÑовеÑиÑÑ, не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð»Ð¸ PID ÑигнализиÑÑÑÑего пÑоÑеÑÑа (ÑказаннÑй в даннÑÑ
ÑобÑÑиÑ) Ñ ÑобÑÑвеннÑм PID ÑеанÑа (его можно ÑзнаÑÑ, обÑаÑивÑиÑÑ Ðº libpq). ÐÑли они ÑовпадаÑÑ, знаÑÐ¸Ñ ÑÐµÐ°Ð½Ñ Ð¿Ð¾Ð»ÑÑил Ñведомление о ÑобÑÑвеннÑÑ
дейÑÑвиÑÑ
, Ñак ÑÑо его можно игноÑиÑоваÑÑ.
ÐаÑамеÑÑÑ
каналÐÐ¼Ñ ÐºÐ°Ð½Ð°Ð»Ð° Ð´Ð»Ñ Ð¿ÐµÑедаÑи ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ (лÑбой иденÑиÑикаÑоÑ).
ÑообÑениеСÑÑока «ÑообÑениÑ», коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÐµÑедана вмеÑÑе Ñ Ñведомлением. Ðна должна задаваÑÑÑÑ Ð¿ÑоÑÑой ÑекÑÑовой конÑÑанÑой. Ð ÑÑандаÑÑной конÑигÑÑаÑии ÐµÑ Ð´Ð»Ð¸Ð½Ð° должна бÑÑÑ Ð¼ÐµÐ½ÑÑе 8000 байÑ. (ÐÑли ÑÑебÑеÑÑÑ Ð¿ÐµÑедаÑÑ Ð´Ð²Ð¾Ð¸ÑнÑе даннÑе или болÑÑой обÑÑм инÑоÑмаÑии, лÑÑÑе помеÑÑиÑÑ Ð¸Ñ Ð² ÑаблиÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ пеÑедаÑÑ ÐºÐ»ÑÑ ÑÑой запиÑи.)
ÐамеÑаниÑ
УведомлениÑ, коÑоÑÑе бÑли оÑпÑавленÑ, но еÑÑ Ð½Ðµ обÑабоÑÐ°Ð½Ñ Ð²Ñеми ожидаÑÑими ÑеанÑами, ÑодеÑжаÑÑÑ Ð² оÑеÑеди. ÐÑли ÑÑа оÑеÑÐµÐ´Ñ Ð¿ÐµÑеполнÑеÑÑÑ, ÑÑанзакÑии, в коÑоÑÑÑ
вÑзÑваеÑÑÑ NOTIFY, бÑдÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ñ Ð¾Ñибкой пÑи попÑÑке ÑикÑаÑии. ÐÑеÑÐµÐ´Ñ Ð´Ð¾Ð²Ð¾Ð»Ñно велика (8 ÐРв ÑÑандаÑÑной конÑигÑÑаÑии), Ñак ÑÑо ÐµÑ ÑазмеÑа должно Ñ
ваÑаÑÑ Ð¿ÑакÑиÑеÑки во вÑеÑ
ÑлÑÑаÑÑ
, но еÑли в ÑеанÑе вÑполнÑеÑÑÑ LISTEN, а заÑем пÑодолжаеÑÑÑ Ð¾ÑÐµÐ½Ñ Ð´Ð»Ð¸ÑелÑÐ½Ð°Ñ ÑÑанзакÑиÑ, оÑеÑÐµÐ´Ñ Ð½Ðµ оÑиÑаеÑÑÑ. Ðак ÑолÑко ÑÑа оÑеÑÐµÐ´Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑеÑÑÑ Ð½Ð°Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ, в жÑÑнал запиÑÑваÑÑÑÑ Ð¿ÑедÑпÑеждениÑ, в коÑоÑÑÑ
ÑказÑваеÑÑÑ, какой ÑÐµÐ°Ð½Ñ Ð¿ÑепÑÑÑÑвÑÐµÑ Ð¾ÑиÑÑке оÑеÑеди. Ð ÑÑом ÑлÑÑае ÑледÑÐµÑ Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑекÑÑей ÑÑанзакÑии в Ñказанном ÑеанÑе, ÑÑÐ¾Ð±Ñ Ð¾ÑеÑÐµÐ´Ñ Ð±Ñла оÑиÑена.
ФÑнкÑÐ¸Ñ pg_notification_queue_usage показÑваеÑ, какой пÑоÑÐµÐ½Ñ Ð¾ÑеÑеди в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð·Ð°Ð½ÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑими ÑведомлениÑми. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 9.25.
ТÑанзакÑиÑ, в коÑоÑой вÑполнÑеÑÑÑ NOTIFY, не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñовлена Ð´Ð»Ñ Ð´Ð²ÑÑ
Ñазной ÑикÑаÑии.
pg_notify
Также оÑпÑавиÑÑ Ñведомление можно, иÑполÑзÑÑ ÑÑнкÑÐ¸Ñ . ÐÑа ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² пеÑвом аÑгÑменÑе Ð¸Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð°, а во вÑоÑом ÑекÑÑ ÑообÑениÑ. ÐоÑаздо Ñдобнее иÑполÑзоваÑÑ ÐµÑ, когда ÑÑебÑеÑÑÑ ÑабоÑаÑÑ Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкими именами каналов и ÑообÑениÑми.pg_notify(text, text)
ÐÑимеÑÑ
ÐемонÑÑÑаÑÐ¸Ñ Ð¿ÑоÑедÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ/полÑÑÐµÐ½Ð¸Ñ ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² psql:
LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.
NOTIFY virtual, 'This is the payload';
Asynchronous notification "virtual" with payload "This is the payload" received from server process with PID 8448.
LISTEN foo;
SELECT pg_notify('fo' || 'o', 'pay' || 'load');
Asynchronous notification "foo" with payload "payload" received from server process with PID 14728.СовмеÑÑимоÑÑÑ
ÐпеÑаÑÐ¾Ñ NOTIFY оÑÑÑÑÑÑвÑÐµÑ Ð² ÑÑандаÑÑе SQL.