PostgreSQL рд╡реНрдпрдВрдЬрдиреЛрдВ: рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рд╕рдордпрдмрджреНрдзрдХ

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

(рдореВрд▓ PostgreSQL рдореЗрдВ PL / pgSQL рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдореЗрд░реЗ рдЕрдиреБрд╕реВрдЪрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм PL / pgSQL рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдореЗрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдпрд╣рд╛рдБ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдореЗрд░реЗ ink рдореЗрдВ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ ред)

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

shared_preload_libraries = 'pg_task' 

PostgreSQL рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╢реЗрдбреНрдпреВрд▓рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдУрд░ рд╕реЗ рдФрд░ рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдХреАрдорд╛ рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрд╛рд░реНрдп рд╕рд╛рд░рдгреА рдмрдирд╛рдПрдЧрд╛ред

рдпрджрд┐ рдЖрдк рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 pg_task.database = 'database1,database2' 

рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 pg_task.database = 'database1:user1,database2:user2' 

рдпрджрд┐ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд╣реАрдВ рд╢реЗрдбреНрдпреВрд▓рд░ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 pg_task_schema.database1 = schema3 

рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреБрд╕реВрдЪрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 pg_task_table.database1 = table3 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╢реЗрдбреНрдпреВрд▓рд░ рдкреНрд░рддреНрдпреЗрдХ 1000 рдПрдордПрд╕ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 pg_task_period.database1 = 100 pg_task_period.database2 = 10 

рддреЛ, рд╢реЗрдбреНрдпреВрд▓рд░ (рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдирд╣реАрдВ рд╣реИ) (рдПрдХ рдпреЛрдЬрдирд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдФрд░) рдРрд╕реЗ рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдп рддрд╛рд▓рд┐рдХрд╛

 id BIGSERIAL NOT NULL PRIMARY KEY, -- ,   dt TIMESTAMP NOT NULL DEFAULT NOW(), --     (- -   ) start TIMESTAMP, --     stop TIMESTAMP, --      queue TEXT NOT NULL DEFAULT 'default', --    (      ) max INT, --        (,      ) pid INT, --  ,    request TEXT NOT NULL, --  SQL   response TEXT, --    state TEXT NOT NULL DEFAULT 'QUEUE', --   (- - ,    , , ...) timeout INTERVAL, --      delete BOOLEAN NOT NULL DEFAULT false, --     ,    repeat INTERVAL, --    drift BOOLEAN NOT NULL DEFAULT true --        

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо SQL рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ

 INSERT INTO task (request) VALUES ('SELECT now()') 

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

рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 5 рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж, рддреЛ рд╣рдо рдпреЛрдЬрдирд╛рдмрджреНрдз рд╕рдордп рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдо рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

 INSERT INTO task (dt, request) VALUES (now() + '5 min':INTERVAL, 'SELECT now()') 

рдФрд░ рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдп рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдП, рддреЛ рд╣рдо рдЗрд╕реЗ рд▓рд┐рдЦ рджреЗрдВрдЧреЗ

 INSERT INTO task (dt, request) VALUES ('2019-07-01 00:00:00', 'SELECT now()') 

рдЕрдЧрд░ рд╣рдореЗрдВ рд╣рд░ 5 рдорд┐рдирдЯ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

 INSERT INTO task (repeat, request) VALUES ('5 min', 'SELECT now()') 

рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рд▓рд┐рдЦреЗрдВ

 INSERT INTO task (repeat, request, drift) VALUES ('5 min', 'SELECT now()', false) 

рддрдм рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ 5 рдорд┐рдирдЯ рдмрд╛рдж (рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рдХреЗ рдмрд╛рдж рдирд╣реАрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ) рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдкрд░рд┐рдгрд╛рдо рд╕реНрддрдВрдн рдкрд░ рдкрд╛рда рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдФрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрд╛рд░реНрдп рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 INSERT INTO task (request) VALUES ('SELECT 1/0') 

рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП 2 рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ

 INSERT INTO task (queue, max, request) VALUES ('queue', 2, 'SELECT now()') 

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЗрд╕ рдХрддрд╛рд░ рдореЗрдВ рд╣рдордиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдп рд╕рдВрдЪрд┐рдд рдХрд░ рд▓рд┐рдП рд╣реИрдВ рдФрд░ рд╡реЗ рдПрдХ рд╕рд╛рде 2 рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рдХрд╛рд░реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ

 INSERT INTO task (queue, max, request) VALUES ('queue', 3, 'SELECT now()') 

рдлрд┐рд░ рдЗрд╕реЗ рдЗрд╕ рдХрддрд╛рд░ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд╢реАрдШреНрд░ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рдд рдпрд╣ рдЕрднреА рднреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреА рддрд░рд╣ рдХреБрдЫ рд╣реИ

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


All Articles