PubSub рд▓рдЧрднрдЧ рдореБрдлреНрдд рд╣реИ: PostgreSQL рдореЗрдВ NOTIFY рд╕реБрд╡рд┐рдзрд╛рдПрдБ

рдпрджрд┐ рдЖрдкрдХреЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд░реНрд╡рд░реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реАрдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░реЗрдбрд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рд░реИрдмрд┐рдЯрдПрдордХреНрдпреВ рдХреНрд▓рд╕реНрдЯрд░, рдпрд╛ рдХреЛрдб рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрджреЗрд╢реЛрдВ (рдкрдмрд╕рдм) рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддрд╛ рд╣реИред рдПрдХ рдФрд░ MQ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧред

рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдмрд▓ рдкрд░ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рдпрд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░реЗрд╖рд┐рдд рд╣реИ , рдФрд░ рдлрд┐рд░ рдкрд╣рд▓реЗ рд╕реЗ рдкрдврд╝реА рдЧрдИ рдЪреАрдЬрд╝реЛрдВ рд╕реЗ рднреА рд╕рд╛рдлрд╝ рдХрд░реЗрдВ ред

рд╣рдо NOTIFY / LISTEN рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдо Node.js. рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗ



рд▓реЗрдХрд┐рди рдЗрд╕ рд░рд╛рд╕реНрддреЗ рдкрд░ рдПрдХ рд░реЗрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдкрд░рд┐рдзрд┐ рдореЗрдВ рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рд╕реБрдиреЗрдВ


LISTEN  
Libpq рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рд╕реНрдЯреЗрди рдХрдорд╛рдВрдб рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдПрд╕рдХреНрдпреВрдПрд▓ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рдордп-рд╕рдордп рдкрд░ рдирдИ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП PQnotify рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЖрдк рдкреАрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ, рддреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡реЗрджрди рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдк рдХрдиреЗрдХреНрд╢рди рдкрд░ рдХреЗрд╡рд▓ рд╕рдордп-рд╕рдордп рдкрд░ SELECT 1 рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЖрдПрдЧреА:
Libpq рдХреА рдмрд╣реБрдд рдкреБрд░рд╛рдиреА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ, NOTIFY рдХрдорд╛рдВрдб рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдордп рдкрд░ рдкреНрд░рд╛рдкреНрддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рдерд╛ - рд▓рдЧрд╛рддрд╛рд░ рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ PQexec рдХреЙрд▓ рдХреЗ рдмрд╛рдж PQnotify рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдпрджреНрдпрдкрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдХреНрд╖рдо рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, psql рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 _tmp=# LISTEN test; LISTEN _tmp=# SELECT 1; ?column? ---------- 1 (1 row) Asynchronous notification "test" with payload "abc123" received from server process with PID 63991. 

рдпрджрд┐ рдПрдХ рд▓рд╛рдЧреВ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╣рдо 1 рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░ рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рджреЗрд░реА рдкрд░ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдпрд╣ рд╡рд┐рдзрд┐ рдХрдиреЗрдХреНрд╢рди рдХреЗ "рд▓рд╛рдЗрдирд┐рдВрдЧ" рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдХреЛрдИ рднреА рдЧрд▓рддреА рд╕реЗ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдХреА рддрд░рдл рд╕реЗ pg_terminate_backend рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ pg_terminate_backend , рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреЛрдИ рд╕реВрдЪрдирд╛ рджрд┐рдП рдмрд┐рдирд╛ рдкреАрдЬреА рдХреЗ рдЕрдЪрд╛рдирдХ "рдХреНрд░реИрд╢" рдирд╣реАрдВ рдерд╛ред

NOTIFY


 NOTIFY  [ ,  ] 

NOTIFY рдХрдорд╛рдВрдб рдЙрди рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд "рд╕рдВрджреЗрд╢" рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдШрдЯрдирд╛ рднреЗрдЬрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдореМрдЬреВрджрд╛ рд▓рд┐рд╕реНрдЯреЗрди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪреИрдирд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЪреИрдирд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред
...
"рд╕рдВрджреЗрд╢" рд▓рд╛рдЗрди рдЬрд┐рд╕реЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ... рдПрдХ рд╕рд░рд▓ рдкрд╛рда рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдорд╛рдирдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ, рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ 8000 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ред
рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ "рд╕рдВрджреЗрд╢" рдореЗрдВ рдЕрдЪрд╛рдирдХ ASCII рд╕реЗ рдХреБрдЫ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ , рдФрд░ рдпрджрд┐ рдпрд╣ 8000 рдмрд╛рдЗрдЯреНрд╕ (рд╡рд░реНрдг рдирд╣реАрдВ!) рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдХрд╛рдЯ рд▓реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЧреЛрдВрдж рдХрд░реЗрдВ ред рдЙрд╕реА рд╕рдордп, рд╣рдореЗрдВ рдРрд╕реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреИрдирд▓ рдмреИрдВрдбрд╡рд┐рдбреНрде рдФрд░ рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рджреЛрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЕрд░реНрдерд╛рддреН, рд╕рдВрднрд╡ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдЯреА рд╕реЗрд╡рд╛ "рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ "рдЧрд▓рд╛" рди рджреЗрдВ, рдЗрд╕реЗ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВред gzip -9 ред

рддрдВрддреНрд░ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ, рдХреЛрдИ рднреА рд╕рдВрджреЗрд╢ рдХреЗ "рд╕реНрд░реЛрдд" рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛ рдиреЛрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ...
... рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХреЛ рдЬрд╛рдБрдЪ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕рдВрдХреЗрддрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдШрдЯрдирд╛ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрдХреЗрддрд┐рдд) рдХрд╛ рдкреАрдЖрдИрдбреА тАЛтАЛрд╕рддреНрд░ рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреАрдЖрдИрдбреА тАЛтАЛрд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЖрдк рдЗрд╕реЗ libpq рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдХреЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рддреНрд░ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪрдирд╛ рдорд┐рд▓реА, рддрд╛рдХрд┐ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
... рдФрд░ рдЧрд╛рд░рдВрдЯреА рд╡рд┐рддрд░рдг рдЖрджреЗрд╢:
рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, NOTIFY рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдПрдХрд▓ рд▓реЗрдирджреЗрди рд╕реЗ рд╕реВрдЪрдирд╛рдПрдВ рд╣рдореЗрд╢рд╛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдЖрддреА рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рднреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдирджреЗрди рд╕реЗ рд╕рдВрджреЗрд╢ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдпреЗ рд▓реЗрдирджреЗрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред
рд╣рдо рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдПрдХ рдЕрд▓рдЧ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрджрд┐ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЧрддрд┐рд╡рд┐рдзрд┐ рднреА рд╣реИ, рддреЛ рд╣рдорд╛рд░реА рд╕реВрдЪрдирд╛ рд╣рдорд╛рд░реА рд╕реНрд╡рдпрдВ рдХреА рд╕реНрд╡рддрдВрддреНрд░ рдЗрдЪреНрдЫрд╛ рдХреЗ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ :
рд▓реЗрди-рджреЗрди рдХрд╛ NOTIFY рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧрд░ NOTIFY рдПрдХ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЗрди-рджреЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рджреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВред рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрди-рджреЗрди рдмрд╛рдзрд┐рдд рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ NOTIFY рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ ред
рдЗрд╕рд▓рд┐рдП, рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдИ рд▓реЗрдирджреЗрди рдпрд╛ рд▓рдВрдмреА рдХреНрд╡реЗрд░реА рдирд╣реАрдВ рд╣реИред

AccessExclusiveLock рдбреЗрдЯрд╛рдмреЗрд╕ 0 рдХреЗ рдХрдХреНрд╖рд╛ 1262 рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ 0 рдкрд░


рдпрджрд┐ рдЕрдЪрд╛рдирдХ рдЖрдкрдХреЗ NOTIFYs рдиреЗ рдРрд╕реЗ рд▓реЙрдХ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЛ рдХреБрдВрдж рдФрд░ рд▓реЙрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рддреЛ рдЖрдк рдЕрднреА рднреА "рд╢реЙрд░реНрдЯ рдкреИрдВрдЯ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдП рд╣реИрдВ", рдФрд░ рдпрд╣ "рд╡рдпрд╕реНрдХ" рдПрдордХреНрдпреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХрддрд╛рд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд╛рдлреА рдмрдбрд╝реА (рдорд╛рдирдХ рдмрд┐рд▓реНрдб рдореЗрдВ 8 рдЬреАрдмреА), рдЕрднреА рднреА рдкрд░рд┐рдорд┐рдд рд╣реИред рдЯреЙрдо рд▓реЗрди рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рдЕрдиреБрд╕рд╛рд░:
рдпрд╣ рд▓реЙрдХ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдзрд┐рд╕реВрдЪрд┐рдд рд╕рдВрджреЗрд╢ (рдУрдВ) рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓реЗрдирджреЗрди рд▓реЙрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред
рдпрд╣реА рд╣реИ, рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ:

  • рдХрдо рдмрд╛рд░ рднреЗрдЬреЗрдВ
    рдпрд╣реА рд╣реИ, рднреЗрдЬреЗ рдЧрдП рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдпреЗ рдХреБрдЫ рдХрд╛рдЙрдВрдЯрд░ рд╣реИрдВ, рдПрдХ рд▓рдВрдмреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ред
  • рдХрдо рднреЗрдЬреЗрдВ
    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд┐рдП рдЧрдП JSON рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдВрдЬреА рдорд╛рдиреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
  • рдХреЗрд╡рд▓ рд╕рдВрдХреЗрдд рднреЗрдЬреЗрдВ , рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ
    рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ - рдХрдИ рдЪреИрдирд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдирд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд▓рд╛рдЧреВ рдЕрд░реНрдереЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛ред
  • рдЕрднреА рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рд╢рд┐рдкрдореЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ

рдЬрдЯрд┐рд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛


рд╢рд░реАрд░ рдХреА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ


рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рд╕рдВрджреЗрд╢ рдореЗрдВ рди рдХреЗрд╡рд▓ рд╡рд░реНрдгреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд░реВрд╕реА рдкрддреНрд░ рднреА, рдФрд░ "рдХрд┐рд╕реА рднреА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝" - рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЗрд╖рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрдХреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдФрд░ рд╣рд╛рдВ, рдпрд╣ рддрд░реАрдХрд╛ рдХрд╛рдлреА рдХрд╛рд░рдЧрд░ рд╣реИ:

 NOTIFY test, E'\x20\x21' 

 Asynchronous notification "test" with payload " !" received from server process with PID 63991. 

рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ:
рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯ рдХреНрд░рдо, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрд╖реНрдЯрд╛рдзрд╛рд░реА рдФрд░ рд╖реЛрдбрд╢-рд╕рдВрдХреЗрддрди рдореЗрдВ, рдорд╛рдиреНрдп рд╕рд░реНрд╡рд░-рдПрдиреНрдХреЛрдбреЗрдб рд╡рд░реНрдг рдмрдирд╛рддреЗ рд╣реИрдВред рдЬрдм рд╕рд░реНрд╡рд░ рдРрд╕реЗ рдмрд╛рдЗрдЯ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп UTF-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдзрд╛рд░рд╛ 4.1.2.3 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдпреВрдирд┐рдХреЛрдб рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрдХреНрд░рдо рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдпреВрдирд┐рдХреЛрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред (рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ UTF-8 рд╡рд░реНрдгреЛрдВ рдХреЛ рдПрдирдХреЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ)
рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ win1251 рд╕реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди-рдкрдВрдЬрд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде, рд╣рдо рджреБрдЦ рдореЗрдВ рд░реЛрдЯреА рд▓реЗрддреЗ рд╣реИрдВ:

 NOTIFY test, E'\x98' -- ERROR: invalid byte sequence for encoding "UTF8": 0x98 

рдЪреВрдБрдХрд┐ рд╣рдо UTF-8 рд╡рд░реНрдгреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдирдХреЛрдб рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ", рд╣рдо рдмреЗрд╕ 64 рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдмреЙрдбреА рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ, рдпрджрд┐ рд╕реАрдорд╛ \x20-\x7E рдмрд╛рд╣рд░ рдХреЛрдИ рд╡рд░реНрдг рд╣реИрдВ рдпрд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╡рд┐рднрд╛рдЬрдиред рдПрдХ рддрд░рдл, рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреА рдпрд╣ рд╡рд┐рдзрд┐ рдЕрддрд┐рд░реЗрдХ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрдврд╝рд╛рддреА рд╣реИ (4: 3 рдЧреБрдгрд╛рдВрдХ), рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдиреНрдпреВрдирддрдо рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рдЕрдЬреАрдм" рдЕрдХреНрд╖рд░ рди рд╣реЛрдВ, рдФрд░ рд╕рдВрджреЗрд╢ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдПрдкреЛрд╕реНрдЯреНрд░реЛрдлрд╝ рд╕реЗ рдмрдЪрдирд╛ :
рдПрдХ рдПрдкреЛрд╕реНрдЯреНрд░реЛрдл рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рджреЛ рдПрдкреЛрд╕реНрдЯреНрд░реЛрдлрд┐рд╕ рд▓рд┐рдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: 'рдЬреЛрди рдСрдл рдЖрд░реНрдХ'ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг (") рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред

рдЦрдВрдб рдкрд╣рдЪрд╛рди


рдЕрдЧрд▓рд╛ рдХрд╛рд░реНрдп 7999 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ "рдХрдЯ" рдХрд░рдирд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдЕрдЪрд╛рдирдХ рдЗрд╕ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред рдФрд░ рддрд╛рдХрд┐ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдЖрджреЗрд╢ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдпрд╛ "рд╡рд┐рджреЗрд╢реА" рдЦрдВрдбреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ "рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ" рдЬрд╛рдирддреЗ рд╣реИрдВ - рдпрд╣ рднреЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреАрдЖрдИрдбреА рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЪреИрдирд▓ рдХрд╛ рдирд╛рдо рд╣реИ ред рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реА рд╣рдореЗрдВ рдЦрдВрдбреЛрдВ рдХреЗ рдЖрдЧрдорди рдХреЗ рдЖрджреЗрд╢ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред

рдкрдбрд╝реЛрд╕реА рд▓реЗрдЦрди
рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдЬрдм рдПрдХ рд╣реА рдЪреИрдирд▓ рдХреЗ рдХрдИ рд▓реЗрдЦрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рдПрдХ рд╣реА рд╕рдордп рдкрд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрдВ (рдЕрд░реНрдерд╛рдд, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЖрд╡реЗрджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднреАрддрд░)ред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рд╕реЗрдЧрдореЗрдВрдЯ рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдПрдХрд▓ рдкрдмрд╕рдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ "рд╕рд╛рдЭрд╛" рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдХрдВрдЯреЗрдирд░ рдХреА рд╕реАрдорд╛


рдХрдИ рдЦрдВрдбреЛрдВ рд╕реЗ рдПрдХ рдЕрднрд┐рдиреНрди рдХрдВрдЯреЗрдирд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХреНрд╖рдг рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╣реИрдВ:

  • рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрдВ рд▓рдХреНрд╖реНрдп рдЖрдХрд╛рд░ (рдмрд╛рдЗрдЯреНрд╕ рдпрд╛ рдЦрдВрдбреЛрдВ рдореЗрдВ) рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг
  • рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЕрдВрддрд┐рдо рдЦрдВрдб [рдирд╣реАрдВ] рдХреЗ рд╕рдВрдХреЗрдд рдХрд╛ рд╕рдВрдЪрд░рдг

рдЪреВрдВрдХрд┐ рд╣рдо PubSub рдХреЛ рдЖрдЦрд┐рд░рдХрд╛рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрджреЗрд╢ рдХрдо рд╣реЛрдВрдЧреЗ рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрд╛рдЗрдЯреНрд╕ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд▓рд╛рднрджрд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрдВрдЯреЗрдирд░ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ / рд╕рдорд╛рдкреНрддрд┐ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЦрдВрдб рдбреЗрдЯрд╛ рдХреЗ рдкрд╣рд▓реЗ рд╡рд░реНрдг рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддреЗ рд╣реБрдП рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░


рд╕рд╛рджреЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ JSON рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ "рд╕рдВрджреЗрд╢" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдкрдХреНрд╖ рдкрд░ рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкреНрд░рддреАрдХ-рдЪрд┐рд╣реНрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдмреЗрд╕ 64 рдореЗрдВ "рдиреЙрди-рдлреЙрд░реНрдореЗрдЯ" рдХреЛ рдПрдирдХреЛрдб рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХрд┐рд╕реА рднреА рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕реЗрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдЦрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓реЗ:

 -- ""   !simple string -- "  "  @{"a":1} --    base64 #<segment> --    base64 $<segment> 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЦрдВрдб рдХреЛ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдЪрд░рд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдПрдХ рдкрдмрдмрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рдХрд░рдирд╛


рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди Node.js рдкрд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо PostgreSQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдб-рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╣рдо рд╢реБрд░реБрдЖрддреА рдлреНрд░реЗрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП PubSub рдХреЛ EventEmitter рдХреЗ рд╡рд╛рд░рд┐рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ , рддрд╛рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреИрдирд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХреЗрдВ:

 const util = require('util'); const EventEmitter = require('events').EventEmitter; const PubSub = function(connection, interval, skipSelf) { //     this.connection = connection; //        this.connection.on('notification', p._onmessage.bind(this)); //         this.skipSelf = skipSelf; //  "" setInterval(() => { this.connection.query('SELECT 1'); }, interval); //     ""  this.slices = {}; }; util.inherits(PubSub, EventEmitter); const p = PubSub.prototype; 

рд╣рдо рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
рдЪреВрдВрдХрд┐ LISTEN / UNLISTEN рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрд╕рдо рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рдЬрдм рдХрд┐рд╕реА рдЪреИрдирд▓ рдХреА рдкреБрдирдГ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдпрд╛ рдЙрд╕ рд╕рджрд╕реНрдпрддрд╛ рд╕реЗ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ, рд╣рдо рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

 //     - "",      //     -        const quot = str => /^[_a-z][0-9a-z_\$]*$/.test(str) ? str : `"${str}"`; p.subscribe = function(channel) { this.connection.query(`LISTEN ${quot(channel)}`); return this; }; p.unsubscribe = function(channel) { this.connection.query(`UNLISTEN ${quot(channel)}`); return this; }; 

рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
 const PAYLOAD_LIMIT = 8000 - 1; const PAYLOAD_FL_STR = '!'; const PAYLOAD_FL_OBJ = '@'; const PAYLOAD_FL_SEQ = '#'; const PAYLOAD_FL_FIN = '$'; const PAYLOAD_SZ_HEAD = 1; const PAYLOAD_SZ_DATA = PAYLOAD_LIMIT - PAYLOAD_SZ_HEAD; //  ""  const reASCII = /^[\x20-\x7E]*$/; //  p.publish = function(channel, payload) { let query = `NOTIFY ${quot(channel)}`; if (payload !== null && payload !== undefined) { //    -    let str = typeof payload == 'string' ? PAYLOAD_FL_STR + payload : PAYLOAD_FL_OBJ + JSON.stringify(payload); if (str.length > PAYLOAD_LIMIT || !reASCII.test(str)) { //   base64- const b64 = Buffer.from(str).toString('base64'); for (let pos = 0, len = b64.length; pos < len; pos += PAYLOAD_SZ_DATA) { let fin = pos + PAYLOAD_SZ_DATA; let seg = fin >= len ? PAYLOAD_FL_FIN + b64.slice(pos) : PAYLOAD_FL_SEQ + b64.slice(pos, fin); this.connection.query(`${query}, '${seg}'`); } } else { //        ? //     str = str.replace(/'/g, "''"); this.connection.query(`${query}, '${str}'`); } } else { //       this.connection.query(query); } return this; }; //    p._onmessage = function(msg) { const {processId, channel, payload} = msg; //  "" if (processId == this.connection.processID && this.skipSelf) { return; } // ""  const id = `${processId}:${channel}`; let rv; //   let fl = payload.charAt(0); if (fl == PAYLOAD_FL_SEQ || fl == PAYLOAD_FL_FIN) { // base64 const str = payload.slice(PAYLOAD_SZ_HEAD); const slices = this.slices; let b64; if (fl == PAYLOAD_FL_FIN) { //   if (slices[id]) { slices[id].push(str); b64 = slices[id].join(''); delete slices[id]; } else { b64 = str; } } else { //     if (slices[id]) { slices[id].push(str); } else { slices[id] = [str]; } } if (b64) { rv = Buffer.from(b64, 'base64').toString(); fl = rv.charAt(0); } } else { //  / rv = payload; } if (rv !== undefined) { //   '' let res = { processId , channel }; if (rv) { //       let data = rv.slice(1); res.payload = fl == PAYLOAD_FL_OBJ ? JSON.parse(data) : data; } this.emit(channel, res); } }; 

рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг
 const pg = require('pg'); const pgsql = new pg.Client({ host : 'example-db' , port : 5432 , user : 'postgres' , password : 'postgres' , database : '_tmp' }); pgsql.connect(err => { let psA = new PubSub(pgsql, 1000); let psB = new PubSub(pgsql, 1000); let chA = 'channel:A'; let chB = 'channel:B'; psA.subscribe(chA); psB.subscribe(chB); psA.on(chA, (msg) => { console.log('A:rcv', msg); }); psB.on(chB, (msg) => { console.log('B:rcv', msg); }); psB.publish(chA); psB.publish(chA, 'simple string'); psB.publish(chA, '  '); psB.publish(chA, {a : 1}); psA.publish(chB, '   100  '.repeat(100)); }); 

рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рдЕрдиреНрдп рдкреАрдПрд▓ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд╛рд░:

Source: https://habr.com/ru/post/hi484978/


All Articles