{"id":25196,"date":"2026-06-11T01:50:18","date_gmt":"2026-06-11T01:50:18","guid":{"rendered":"https:\/\/umang.pk\/2026\/06\/11\/%da%af%d9%88-%d9%85%db%8c%da%ba-%d9%be%d9%88%d8%b3%d9%b9%da%af%d8%b1%db%8c-%d8%a7%db%8c%d8%b3-%da%a9%db%8c%d9%88-%d8%a7%db%8c%d9%84-%da%a9%db%8c-%d8%ad%d9%85%d8%a7%db%8c%d8%aa-%db%8c%d8%a7%d9%81%d8%aa\/"},"modified":"2026-06-11T01:50:18","modified_gmt":"2026-06-11T01:50:18","slug":"%da%af%d9%88-%d9%85%db%8c%da%ba-%d9%be%d9%88%d8%b3%d9%b9%da%af%d8%b1%db%8c-%d8%a7%db%8c%d8%b3-%da%a9%db%8c%d9%88-%d8%a7%db%8c%d9%84-%da%a9%db%8c-%d8%ad%d9%85%d8%a7%db%8c%d8%aa-%db%8c%d8%a7%d9%81%d8%aa","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/06\/11\/%da%af%d9%88-%d9%85%db%8c%da%ba-%d9%be%d9%88%d8%b3%d9%b9%da%af%d8%b1%db%8c-%d8%a7%db%8c%d8%b3-%da%a9%db%8c%d9%88-%d8%a7%db%8c%d9%84-%da%a9%db%8c-%d8%ad%d9%85%d8%a7%db%8c%d8%aa-%db%8c%d8%a7%d9%81%d8%aa\/","title":{"rendered":"\u06af\u0648 \u0645\u06cc\u06ba \u067e\u0648\u0633\u0679\u06af\u0631\u06cc \u0627\u06cc\u0633 \u06a9\u06cc\u0648 \u0627\u06cc\u0644 \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u06cc\u0627\u0641\u062a\u06c1 \u0679\u0627\u0633\u06a9 \u0642\u0637\u0627\u0631 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba"},"content":{"rendered":"<div id=\"\">\n<p>\u0648\u06cc\u0628 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0646\u0627\u062a\u06d2 \u0648\u0642\u062a\u060c \u062a\u0645\u0627\u0645 \u06a9\u0627\u0645 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u06a9\u0686\u06be \u0622\u067e\u0631\u06cc\u0634\u0646 \u0633\u0633\u062a \u06c1\u06cc\u06ba\u06d4 \u06a9\u0686\u06be \u0622\u067e\u0631\u06cc\u0634\u0646 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0686\u06be \u06a9\u0627\u0645 \u0628\u0639\u062f \u0645\u06cc\u06ba \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4 \u0627\u06cc \u0645\u06cc\u0644\u0632 \u0628\u06be\u06cc\u062c\u0646\u0627\u060c \u0627\u0645\u06cc\u062c\u0632 \u06a9\u0627 \u0633\u0627\u0626\u0632 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627\u060c \u0648\u06cc\u0628 \u06c1\u06a9\u0633 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u0627\u060c \u0631\u067e\u0648\u0631\u0679\u0633 \u0628\u0646\u0627\u0646\u0627\u060c \u0627\u0648\u0631 \u062a\u06be\u0631\u0688 \u067e\u0627\u0631\u0679\u06cc APIs \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0622\u0632\u0645\u0627\u0646\u0627 \u06cc\u06c1 \u0633\u0628 \u0627\u0686\u06be\u06cc \u0645\u062b\u0627\u0644\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u06a9\u0627\u0645 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0679\u0627\u0633\u06a9 \u0633\u0633\u0679\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0633\u0646\u0628\u06be\u0627\u0644\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0645\u0636\u0645\u0648\u0646 \u0627\u06cc\u06a9 \u0627\u0648\u067e\u0646 \u0633\u0648\u0631\u0633 \u06af\u0648 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 Swig \u06a9\u06c1\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06cc \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06c1 PostgreSQL \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u06cc\u0627\u0641\u062a\u06c1 \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631\u06cc\u06ba \u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u062a\u06a9\u060c \u0622\u067e \u0633\u0645\u062c\u06be \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 Go \u0627\u0648\u0631 PostgreSQL \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0679\u0627\u0633\u06a9 \u06a9\u06cc\u0648 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u0627\u0648\u0631 PostgreSQL \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u062e\u06cc\u0627\u0644 \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u06a9\u06cc\u0648\u06ba \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<ol>\n<li>\n<p>\u0634\u0631\u0637\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>\u06a9\u06cc\u0627 \u0633\u06cc\u06a9\u06be\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/p>\n<\/li>\n<li>\n<p>\u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 PostgreSQL \u06a9\u06cc\u0648\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u061f<\/p>\n<\/li>\n<li>\n<p>\u0633\u0648\u0626\u06af \u06a9\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631<\/p>\n<\/li>\n<li>\n<p>PostgreSQL \u0645\u06cc\u06ba \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0627 \u0627\u0638\u06c1\u0627\u0631 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06af\u0648 \u0645\u06cc\u06ba \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u06cc\u0633\u06d2 \u06a9\u06cc \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0631\u06cc\u0627\u0633\u062a \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0633\u06a9 \u06a9\u06cc\u0633\u06d2 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0645\u062a\u0639\u062f\u062f \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/p>\n<\/li>\n<li>\n<p>\u06c1\u0645 \u0648\u0642\u062a\u06cc \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06af\u0648\u0631\u0648\u0679\u06cc\u0646\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>LISTEN\/NOTIFY \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u062c\u06af\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u0688\u0648\u0627\u0626\u0632\u0631\u06cc \u0644\u0627\u06a9\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0644\u06cc\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0646\u0627\u06a9\u0627\u0645 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0688\u0631\u0627\u0626\u06cc\u0648\u0631\u0648\u06ba \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0646\u062a\u06cc\u062c\u06c1<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<p>\u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u0648 \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u06af\u06cc:<\/p>\n<ul>\n<li>\n<p>\u06af\u0648 \u06a9\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0639\u0644\u0645 (\u0633\u0679\u0631\u06a9\u0679\u0633\u060c \u0627\u0646\u0679\u0631\u0641\u06cc\u0633\u060c \u06af\u0648\u0631\u0648\u0679\u06cc\u0646\u0632)<\/p>\n<\/li>\n<li>\n<p>PostgreSQL \u0627\u0648\u0631 SQL \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0633\u0645\u062c\u06be<\/p>\n<\/li>\n<li>\n<p>Go \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba (1.21 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1)<\/p>\n<\/li>\n<li>\n<p>PostgreSQL \u0645\u062b\u0627\u0644 \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06cc\u0627 \u062f\u0648\u0631 \u0633\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-what-you-will-learn\">\u06a9\u06cc\u0627 \u0633\u06cc\u06a9\u06be\u0646\u0627 \u06c1\u06d2\u06d4<\/h2>\n<ul>\n<li>\n<p>PostgreSQL \u0645\u06cc\u06ba \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u0627\u0648\u0631 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06c1\u0645 \u0648\u0642\u062a \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06a9\u0627\u0645 \u06a9\u0627 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u062f\u0639\u0648\u06cc \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4 <code>FOR UPDATE SKIP LOCKED<\/code><\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u0645\u0644\u0627\u0632\u0645\u06cc\u0646 \u06a9\u0648 \u0645\u0624\u062b\u0631 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0628\u06cc\u062f\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 <code>LISTEN\/NOTIFY<\/code><\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u0688\u0648\u0627\u0626\u0632\u0631\u06cc \u0644\u0627\u06a9\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u062b\u0627\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0644\u06cc\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06af\u0648 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633\u060c \u06af\u0648\u0631\u0648\u0679\u06cc\u0646\u0632\u060c \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642\u060c \u0627\u0648\u0631 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u062d\u0642\u06cc\u0642\u06cc \u0646\u0638\u0627\u0645\u0648\u06ba \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u06cc\u0633\u06d2 \u0641\u0679 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-what-is-a-job-queue\">\u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h2>\n<p>\u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u0628\u0639\u062f \u0645\u06cc\u06ba \u06a9\u06cc\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0627\u0645 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0646\u0638\u0627\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u0627\u0631\u06a9\u0646 \u0642\u0637\u0627\u0631 \u0633\u06d2 \u06a9\u0627\u0645 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0635\u0627\u0631\u0641 \u0633\u0627\u0626\u0646 \u0627\u067e \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u067e\u0646\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u06ba \u0635\u0627\u0631\u0641 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0627\u0639\u0645\u0627\u0644 \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-json\">{\n  \"kind\": \"send_welcome_email\",\n  \"payload\": {\n    \"to\": \"user@example.com\",\n    \"subject\": \"Welcome!\"\n  }\n}\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0648\u0631\u06a9\u0631 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u0627\u0645 \u06a9\u0648 \u0627\u0679\u06be\u0627\u0626\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0627\u06cc \u0645\u06cc\u0644 \u0628\u06be\u06cc\u062c\u06d2 \u06af\u0627\u06d4 \u06cc\u06c1 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0648\u0627\u0628 \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u0627\u0626\u0646 \u0627\u067e \u0631\u0648\u0679 \u06a9\u0648 \u0627\u06cc \u0645\u06cc\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u0648 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0626\u06cc \u0627\u06c1\u0645 \u0633\u0648\u0627\u0644\u0627\u062a \u06a9\u06d2 \u062c\u0648\u0627\u0628\u0627\u062a \u062f\u06cc\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0645\u06cc\u0631\u0627 \u06a9\u0627\u0645 \u06a9\u06c1\u0627\u06ba \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2\u061f<\/p>\n<\/li>\n<li>\n<p>\u0648\u0631\u06a9\u0631\u0632 \u06a9\u0648 \u0646\u0648\u06a9\u0631\u06cc\u0627\u06ba \u06a9\u06cc\u0633\u06d2 \u0645\u0644\u062a\u06cc \u06c1\u06cc\u06ba\u061f<\/p>\n<\/li>\n<li>\n<p>\u0622\u067e \u062f\u0648 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0627\u0645 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0631\u0648\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<\/li>\n<li>\n<p>\u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u0648\u06ba\u061f<\/p>\n<\/li>\n<li>\n<p>\u0622\u067e \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<\/li>\n<li>\n<p>\u0622\u067e \u0645\u0644\u0627\u0632\u0645\u062a \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u0627\u0648\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u06a9\u0633 \u0637\u0631\u062d \u0645\u0633\u062a\u0642\u0644 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<\/li>\n<\/ul>\n<p>\u0633\u0648\u0626\u06af \u0627\u0646 \u0633\u0648\u0627\u0644\u0627\u062a \u06a9\u0627 \u062c\u0648\u0627\u0628 Go \u0627\u0648\u0631 PostgreSQL \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-why-use-postgresql-for-a-queue\">\u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 PostgreSQL \u06a9\u06cc\u0648\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u061f<\/h2>\n<p>\u0628\u06c1\u062a \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631\u06cc\u06ba Redis\u060c RabbitMQ\u060c SQS\u060c \u06cc\u0627 Kafka \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0648\u06c1 \u062a\u0645\u0627\u0645 \u0645\u0641\u06cc\u062f \u0627\u0648\u0632\u0627\u0631 \u06c1\u06cc\u06ba\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0628\u06c1\u062a \u0633\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc PostgreSQL \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u0645\u06cc\u06ba \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u062a\u0648\u060c \u0622\u067e \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0679\u0627\u0633\u06a9 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0627\u0648\u0631 \u0633\u0631\u0648\u0633 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>PostgreSQL \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0626\u06cc \u0628\u06c1\u062a \u0645\u0641\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<ul>\n<li>\n<p>\u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u06a9\u0627\u0645 \u06a9\u06d2 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0632<\/p>\n<\/li>\n<li>\n<p>\u062c\u0648\u06c1\u0631\u06cc \u062a\u062d\u0631\u06cc\u0631\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06cc\u0646 \u062f\u06cc\u0646<\/p>\n<\/li>\n<li>\n<p>\u0645\u062d\u0641\u0648\u0638 \u06a9\u0646\u06a9\u0631\u0646\u0679 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0637\u0627\u0631 \u0644\u0627\u06a9\u0646\u06af<\/p>\n<\/li>\n<li>\n<p><code>SKIP LOCKED<\/code>    \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u062f\u0648\u0633\u0631\u06cc \u0645\u0644\u0627\u0632\u0645\u062a\u0648\u06ba \u06a9\u0627 \u062f\u0639\u0648\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0628\u0646\u0627\u0646\u0627<\/p>\n<\/li>\n<li>\n<p><code>LISTEN\/NOTIFY<\/code>    \u0646\u0626\u06cc \u0646\u0648\u06a9\u0631\u06cc \u0622\u0646\u06d2 \u067e\u0631 \u0645\u0644\u0627\u0632\u0645\u06cc\u0646 \u06a9\u0648 \u062c\u06af\u0627\u0646\u0627\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0631\u06c1\u0646\u0645\u0627 \u06a9\u06d2 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u0688\u0648\u0627\u0626\u0632\u0631\u06cc \u0644\u0627\u06a9\u0646\u06af<\/p>\n<\/li>\n<li>\n<p>\u0644\u0686\u06a9\u062f\u0627\u0631 \u0679\u0627\u0633\u06a9 \u067e\u06d2 \u0644\u0648\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 JSONB<\/p>\n<\/li>\n<\/ul>\n<p>\u062a\u062c\u0627\u0631\u062a\u06cc \u062a\u0639\u0644\u0642\u0627\u062a \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 PostgreSQL \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u06cc\u0627\u0641\u062a\u06c1 \u0642\u0637\u0627\u0631\u06cc\u06ba \u0627\u06cc\u0648\u0646\u0679 \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06a9\u0627 \u06cc\u0627 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u0631\u0648\u0679\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 RabbitMQ \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0639\u0627\u0645 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u067e\u0633 \u0645\u0646\u0638\u0631 \u06a9\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0622\u0633\u0627\u0646\u060c \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0648\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0622\u0633\u0627\u0646 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-swigs-architecture\">\u0633\u0648\u0626\u06af \u06a9\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631<\/h2>\n<p>\u0627\u0639\u0644\u06cc \u0633\u0637\u062d \u067e\u0631\u060c \u0633\u0648\u0626\u06af \u067e\u0627\u0646\u0686 \u062d\u0635\u0648\u06ba \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2:<\/p>\n<ol>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>swig_jobs<\/code> PostgreSQL \u0645\u06cc\u06ba \u0679\u06cc\u0628\u0644<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 \u0648\u0631\u06a9\u0631 \u0631\u062c\u0633\u0679\u0631\u06cc \u062c\u0648 \u0648\u0631\u06a9\u0631\u0632 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u062c\u0627\u0628 \u06a9\u06d2 \u0646\u0627\u0645\u0648\u06ba \u06a9\u0627 \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0688\u0631\u0627\u0626\u06cc\u0648\u0631 \u06a9\u06cc \u067e\u0631\u062a \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <code>pgx<\/code> \u0627\u0648\u0631 <code>database\/sql<\/code><\/p>\n<\/li>\n<li>\n<p>\u0645\u0634\u062a\u0631\u06a9\u06c1 \u062f\u06cc\u06a9\u06be \u0628\u06be\u0627\u0644 \u06a9\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06cc\u0688\u0631 \u0644\u0648\u067e<\/p>\n<\/li>\n<\/ol>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0628\u06c1\u0627\u0624 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<ol>\n<li>\n<p>\u06a9\u0627\u0644 \u0627\u06cc\u067e <code>AddJob<\/code><\/p>\n<\/li>\n<li>\n<p>\u0633\u0648\u0626\u06af JSON \u067e\u0631 \u062c\u0627\u0628 \u067e\u06d2 \u0644\u0648\u0688 \u06a9\u0648 \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u0648\u0626\u06af \u0642\u0637\u0627\u0631\u06cc\u06ba \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>swig_jobs<\/code><\/p>\n<\/li>\n<li>\n<p>PostgreSQL \u0627\u06cc\u06a9 \u0627\u0637\u0644\u0627\u0639 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0646\u0648\u06a9\u0631\u06cc \u0628\u0646 \u06af\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 \u06af\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u0679\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u06a9\u0627\u0645 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>PostgreSQL \u0642\u0637\u0627\u0631 \u06a9\u0648 \u0644\u0627\u06a9 \u06a9\u0631\u0646\u0627 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u0633 \u0642\u0637\u0627\u0631 \u06a9\u0627 \u062f\u0639\u0648\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0627\u0645 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u0648\u0626\u06af \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u06cc\u0627 \u0646\u0627\u06a9\u0627\u0645 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0634\u0627\u0646 \u0632\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0645\u0634\u06a9\u0644 \u062d\u0635\u06d2 \u06c1\u06cc\u06ba \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc\u060c \u063a\u0644\u0637\u06cc\u0627\u06ba\u060c \u06a9\u0646\u06a9\u0634\u0646 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644\u060c \u0627\u0648\u0631 \u062e\u062a\u0645 \u06a9\u0631\u0646\u0627\u06d4 \u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba Go \u0627\u0648\u0631 PostgreSQL \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u06be\u06cc\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-represent-jobs-in-postgresql\">PostgreSQL \u0645\u06cc\u06ba \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0627 \u0627\u0638\u06c1\u0627\u0631 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06cc\u06c1\u0627\u06ba \u0633\u0648\u0626\u06af \u0627\u06cc\u06a9\u0634\u0646 \u0679\u06cc\u0628\u0644 \u06a9\u0627 \u0627\u06cc\u06a9 \u0622\u0633\u0627\u0646 \u0648\u0631\u0698\u0646 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-sql\">CREATE TABLE swig_jobs (\n  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n  kind TEXT NOT NULL,\n  queue TEXT NOT NULL,\n  payload JSONB NOT NULL,\n  status TEXT NOT NULL DEFAULT 'pending',\n  priority INTEGER NOT NULL DEFAULT 0,\n  attempts INTEGER NOT NULL DEFAULT 0,\n  max_attempts INTEGER NOT NULL DEFAULT 3,\n  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n  scheduled_for TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n  instance_id UUID,\n  worker_id UUID,\n  locked_at TIMESTAMPTZ,\n  last_error TEXT,\n  last_error_at TIMESTAMPTZ\n);\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0642\u0637\u0627\u0631 \u0627\u06cc\u06a9 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06c1\u06d2\u06d4 \u0627\u06c1\u0645 \u06a9\u0627\u0644\u0645 \u06cc\u06c1 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><code>kind<\/code>: \u0645\u0644\u0627\u0632\u0645\u062a \u06a9\u06cc \u0642\u0633\u0645\u060c \u062c\u06cc\u0633\u06d2 <code>send_email<\/code><\/p>\n<\/li>\n<li>\n<p><code>payload<\/code>: \u06a9\u0627\u0645 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 JSON \u0688\u06cc\u0679\u0627 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>status<\/code>: \u0686\u0627\u06c1\u06d2 \u06a9\u0627\u0645 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u06c1\u06d2\u060c \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af\u060c \u0645\u06a9\u0645\u0644\u060c \u06cc\u0627 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>attempts<\/code>: \u062c\u062a\u0646\u06cc \u0628\u0627\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u06af\u0626\u06cc\u06d4<\/p>\n<\/li>\n<li>\n<p><code>scheduled_for<\/code>: \u062c\u0628 \u0679\u0627\u0633\u06a9 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06c1\u0648\u06d4<\/p>\n<\/li>\n<li>\n<p><code>locked_at<\/code>: \u062c\u0628 \u0646\u0648\u06a9\u0631\u06cc \u06a9\u0627 \u062f\u0639\u0648\u06cc\u0670 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0645\u06cc\u0632 \u0633\u0686\u0627\u0626\u06cc \u06a9\u0627 \u0630\u0631\u06cc\u0639\u06c1 \u06c1\u06d2\u06d4 PostgreSQL \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u062c\u06af\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u0642\u0637\u0627\u0631\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0644\u0627\u0626\u0646 <code>swig_jobs<\/code> \u06c1\u0648\u06ba<\/p>\n<h2 id=\"heading-how-to-define-a-worker-in-go\">\u06af\u0648 \u0645\u06cc\u06ba \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u06cc\u0633\u06d2 \u06a9\u06cc \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0633\u0648\u0626\u06af \u0645\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u06a9\u0627\u0631\u06a9\u0646 \u06af\u0648 \u06a9\u06cc \u0627\u06cc\u06a9 \u0642\u0633\u0645 \u06c1\u06d2 \u062c\u0648 \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0642\u0633\u0645 \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0627\u06cc \u0645\u06cc\u0644 \u06a9\u0627\u0631\u06a9\u0646 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-go\">type EmailWorker struct {\n    To      string `json:\"to\"`\n    Subject string `json:\"subject\"`\n    Body    string `json:\"body\"`\n}\n\nfunc (w *EmailWorker) JobName() string {\n    return \"send_email\"\n}\n\nfunc (w *EmailWorker) Process(ctx context.Context) error {\n    fmt.Printf(\"Sending email to %s with subject %s\\n\", w.To, w.Subject)\n    return nil\n}\n<\/code><\/pre>\n<p>\u062f\u0648 \u0627\u06c1\u0645 \u0637\u0631\u06cc\u0642\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0633\u0627\u062e\u062a\u06cc \u0641\u06cc\u0644\u0688\u0632 \u0628\u06be\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u062f\u0644\u0627\u0626\u0644 \u06c1\u06cc\u06ba\u06d4 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a <code>EmailWorker<\/code>\u0633\u0648\u0626\u06af \u0633\u0627\u062e\u062a \u06a9\u0648 JSON \u067e\u0631 \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 PostgreSQL \u0645\u06cc\u06ba \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0639\u062f \u0645\u06cc\u06ba\u060c \u06a9\u0627\u0631\u06a9\u0646 \u0642\u0637\u0627\u0631 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 JSON \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06cc \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633 \u0644\u06d2 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>EmailWorker<\/code>\u0627\u0648\u0631 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>Process<\/code>.<\/p>\n<h3 id=\"heading-go-interfaces\">\u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>\u06af\u0648 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u0648\u0626\u06af \u06a9\u0648 \u06c1\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06cc \u0635\u062d\u06cc\u062d \u0645\u062e\u0635\u0648\u0635 \u0642\u0633\u0645 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0635\u0631\u0641 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0631\u06a9\u0646 \u0679\u0627\u0633\u06a9 \u06a9\u0627 \u0646\u0627\u0645 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0645 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-go\">type Worker interface {\n    JobName() string\n    Process(context.Context) error\n}\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0642\u0633\u0645 \u06a9\u0627 \u0627\u06cc\u06a9 \u0645\u062a\u0639\u0644\u0642\u06c1 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u0648 \u0645\u0637\u0645\u0626\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06a9\u0633\u06cc \u0648\u0627\u0636\u062d \u0627\u0639\u0644\u0627\u0646 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06af\u0648 \u0645\u06cc\u06ba \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0628\u06c1\u062a \u0645\u0641\u06cc\u062f \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0648\u0631\u0627\u062b\u062a \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba.<\/p>\n<h2 id=\"heading-how-to-register-workers-without-sharing-state\">\u0631\u06cc\u0627\u0633\u062a \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0633\u0648\u0626\u06af \u06a9\u06d2 \u067e\u0627\u0633 \u0648\u0631\u06a9\u0631 \u0631\u062c\u0633\u0679\u0631\u06cc \u06c1\u06d2 \u062c\u0648 \u0648\u0631\u06a9\u0631\u0632 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u062c\u0627\u0628 \u06a9\u06d2 \u0646\u0627\u0645\u0648\u06ba \u06a9\u0627 \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-go\">registry := workers.NewWorkerRegistry()\nregistry.RegisterWorker(&EmailWorker{})\n<\/code><\/pre>\n<p>\u0628\u0639\u062f \u0645\u06cc\u06ba\u060c \u062c\u0628 \u0622\u067e \u0627\u067e\u0646\u06cc \u0679\u0627\u0633\u06a9 \u0644\u0627\u0626\u0646 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0627\u06cc\u0633\u0627 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba: <code>kind = 'send_email'<\/code>\u0633\u0648\u0626\u06af \u0631\u062c\u0633\u0679\u0631\u0688 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0688\u06be\u0648\u0646\u0688\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0644\u0637\u06cc\u0641 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4 \u062c\u0628 \u062f\u0631\u0633\u062a \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0631\u062c\u0633\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 <code>&EmailWorker{}<\/code> \u067e\u0648\u0627\u0626\u0646\u0679\u0631\u0632 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0627\u0646 \u06a9\u0648 \u062a\u0645\u0627\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2\u060c \u0645\u062a\u0639\u062f\u062f \u06af\u0648\u0631\u0648\u0679\u06cc\u0646\u0632 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u067e\u06d2 \u0644\u0648\u0688 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc Go \u0648\u06cc\u0644\u06cc\u0648 \u067e\u0631 \u0627\u062a\u0627\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0633\u0648\u0626\u06af \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0641\u06cc\u06a9\u0679\u0631\u06cc \u06a9\u06d2 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06a9\u06d2 \u0627\u0633 \u06a9\u0648 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u0648 \u067e\u06a9\u0691 \u0644\u06cc\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 JSON \u06a9\u06d2 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0631 \u062f\u0639\u0648\u06cc \u06a9\u0631\u062f\u06c1 \u06a9\u0627\u0645 \u06a9\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06cc \u0627\u06cc\u06a9 \u0646\u0626\u06cc \u0645\u062b\u0627\u0644 \u0645\u0644\u062a\u06cc \u06c1\u06d2\u06d4 API \u0622\u0633\u0627\u0646 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06c1\u0688 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 Swig \u0646\u0626\u06d2 APIs \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>EmailWorker<\/code> \u06c1\u0631 \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0641\u06cc\u062f \u06af\u0648 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2\u06d4 \u0627\u067e\u0646\u06d2 \u0639\u0648\u0627\u0645\u06cc API \u06a9\u0648 \u0633\u0627\u062f\u06c1 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u067e\u0646\u06cc \u062f\u0627\u062e\u0644\u06cc \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u06a9\u0648 \u0645\u0632\u06cc\u062f \u0645\u062d\u0641\u0648\u0638 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-add-a-job\">\u0679\u0627\u0633\u06a9 \u06a9\u06cc\u0633\u06d2 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0635\u0627\u0631\u0641 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0679\u0627\u0633\u06a9 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0627\u06cc\u0633\u0627 \u0644\u06af\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-go\">err := swigClient.AddJob(ctx, &EmailWorker{\n    To:      \"user@example.com\",\n    Subject: \"Welcome!\",\n    Body:    \"Thanks for signing up.\",\n})\n<\/code><\/pre>\n<p>\u0633\u0648\u0626\u06af \u06a9\u0627 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0639\u0645\u0644 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-go\">argsJSON, err := json.Marshal(workerWithArgs)\nif err != nil {\n    return err\n}\n\n_, err = db.ExecContext(ctx, `\n    INSERT INTO swig_jobs (kind, queue, payload, priority, scheduled_for, status)\n    VALUES (\\(1, \\)2, \\(3, \\)4, $5, 'pending')\n`, jobName, queue, argsJSON, priority, runAt)\n<\/code><\/pre>\n<h3 id=\"heading-how-to-enqueue-jobs-inside-transactions\">\u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06cc\u0633\u06d2 \u0644\u06af\u0627\u0626\u06cc \u062c\u0627\u0626\u06d2\u06d4<\/h3>\n<p>\u0622\u067e \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 PostgreSQL \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0648\u062c\u06c1 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u0633\u0627\u0626\u0646 \u0627\u067e \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u062f\u0627\u062e\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u06c1\u0648\u06ba \u0627\u0648\u0631 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062e\u0648\u0634 \u0622\u0645\u062f\u06cc\u062f \u0627\u06cc \u0645\u06cc\u0644 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u06c1\u0648\u06ba\u06d4 \u0627\u06af\u0631 \u06cc\u06c1 \u0686\u06cc\u0632\u06cc\u06ba \u0627\u0644\u06af \u0627\u0644\u06af \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba \u062a\u0648\u060c \u0645\u062a\u0636\u0627\u062f \u0631\u06cc\u0627\u0633\u062a\u0648\u06ba \u06a9\u0627 \u0646\u062a\u06cc\u062c\u06c1 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2. \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0645\u06cc\u06ba\u060c \u06cc\u0627 \u062a\u0648 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u06cc\u0627 \u062f\u0648\u0646\u0648\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-go\">tx, err := pool.Begin(ctx)\nif err != nil {\n    return err\n}\ndefer tx.Rollback(ctx)\n\n_, err = tx.Exec(ctx, `INSERT INTO users (email) VALUES ($1)`, email)\nif err != nil {\n    return err\n}\n\nerr = swigClient.AddJobWithTx(ctx, tx, &EmailWorker{\n    To:      email,\n    Subject: \"Welcome!\",\n    Body:    \"Thanks for joining.\",\n})\nif err != nil {\n    return err\n}\n\nreturn tx.Commit(ctx)\n<\/code><\/pre>\n<p>\u062c\u0628 \u0627\u06cc\u06a9 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u06a9\u0648 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06a9\u0648\u0626\u06cc \u0635\u0627\u0631\u0641 \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0679\u0627\u0633\u06a9 \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0648\u0631 \u0642\u0637\u0627\u0631 \u0627\u0644\u06af \u0627\u0644\u06af \u0646\u0638\u0627\u0645 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0633 \u06a9\u06cc \u0636\u0645\u0627\u0646\u062a \u062f\u06cc\u0646\u0627 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-handle-multiple-workers-safely\">\u0645\u062a\u0639\u062f\u062f \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/h2>\n<p>\u0642\u0637\u0627\u0631\u06cc\u06ba \u0627\u0633 \u0648\u0642\u062a \u062f\u0644\u0686\u0633\u067e \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0628 \u0628\u06c1\u062a \u0633\u06d2 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0686\u0644 \u0631\u06c1\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u062a\u06cc\u0646\u0648\u06ba \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06af\u0644\u06d2 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 PostgreSQL \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u062a\u06d2 \u06a9\u06c1 \u062a\u06cc\u0646\u0648\u06ba \u0644\u0648\u06af \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0648\u0644\u06cc \u0627\u067e\u0631\u0648\u0686 \u0645\u06cc\u06ba \u0631\u06cc\u0633 \u06a9\u06cc \u0634\u0631\u0637 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062f\u0648 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0627\u0645 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-postgresql-for-update-skip-locked\">\u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u0648 \u0686\u06be\u0648\u0691\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 PostgreSQL \u0645\u0642\u0641\u0644 \u06c1\u06d2\u06d4<\/h3>\n<p>PostgreSQL \u06a9\u0633\u06cc \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0645\u0646\u062a\u062e\u0628 \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u0648 \u0644\u0627\u06a9 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 <code>FOR UPDATE<\/code> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 &quot;\u0627\u0633 \u0642\u0637\u0627\u0631 \u06a9\u0648 \u0644\u0627\u06a9 \u06a9\u0631\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06c1\u0645 \u0627\u0633\u06d2 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u062c\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4&#8221; <code>SKIP LOCKED<\/code> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 &quot;\u0627\u06af\u0631 \u06a9\u0633\u06cc \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06d2 \u067e\u0627\u0633 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0642\u0637\u0627\u0631 \u0628\u0646\u062f \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633 \u0642\u0637\u0627\u0631 \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba\u06d4&#8221;<\/p>\n<p>\u06cc\u06c1 \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0633\u06cc \u0645\u0631\u06a9\u0632\u06cc \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba\u06d4 \u0633\u0648\u0626\u06af \u0627\u06cc\u0679\u0645 \u0627\u067e \u0688\u06cc\u0679 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-sql\">UPDATE swig_jobs\nSET status=\"processing\",\n    instance_id = $1,\n    worker_id = $2,\n    locked_at = NOW(),\n    attempts = attempts + 1\nWHERE id = (\n  SELECT id\n  FROM swig_jobs\n  WHERE status=\"pending\"\n    AND scheduled_for <= NOW()\n  ORDER BY priority DESC, created_at\n  FOR UPDATE SKIP LOCKED\n  LIMIT 1\n)\nRETURNING id, kind, payload;\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0642\u0641\u0644 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0646\u06c1\u06cc\u06ba \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0634\u0627\u0646 \u0632\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0646\u06d2 \u0679\u0627\u0633\u06a9 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u062a\u06be\u06cc\u060c \u0627\u0648\u0631 \u0679\u0627\u0633\u06a9 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0648\u0627\u067e\u0633 \u06a9\u0631 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0633\u0628 \u062c\u0648\u06c1\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0628\u06be\u06cc \u0627\u0644\u06af \u0627\u0644\u06af \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2\u06d4 <code>SELECT<\/code> \u0627\u0648\u0631 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0645\u06cc\u062f \u06c1\u06d2 <code>UPDATE<\/code> \u06cc\u06c1 \u0627\u0628 \u0628\u06be\u06cc \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-use-goroutines-for-concurrent-workers\">\u06c1\u0645 \u0648\u0642\u062a\u06cc \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06af\u0648\u0631\u0648\u0679\u06cc\u0646\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0633\u0648\u0626\u06af \u0648\u0631\u06a9\u0631 \u0644\u0648\u067e \u06a9\u0648 \u06af\u0648\u0631\u0648\u0679\u06cc\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-go\">for i := 0; i < maxWorkers; i++ {\n    go s.startWorker(ctx, queueType)\n}\n<\/code><\/pre>\n<p>\u06c1\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 PostgreSQL \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 \u06a9\u0648\u0646 \u0633\u06d2 \u06a9\u0627\u0645 \u0645\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06af\u0648 \u06a9\u0646\u06a9\u0631\u0646\u0633\u06cc \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06af\u0648\u0631\u0648\u0679\u06cc\u0646\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0628\u06a9\u06c1 PostgreSQL \u0645\u062d\u0641\u0648\u0638 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0627\u0644\u06d2 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-how-to-handle-graceful-shutdown\">\u062e\u0648\u0628\u0635\u0648\u0631\u062a \u0634\u0679 \u0688\u0627\u0624\u0646 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u062c\u0628 \u06a9\u0648\u0626\u06cc \u0633\u0631\u0648\u0633 \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06af\u0648\u062a\u06be <code>sync.WaitGroup<\/code> \u0645\u062f\u062f\u06af\u0627\u0631:<\/p>\n<pre><code class=\"language-go\">var wg sync.WaitGroup\n\nwg.Add(1)\ngo func() {\n    defer wg.Done()\n    processJobs()\n}()\n\nwg.Wait()\n<\/code><\/pre>\n<p>\u0645\u06cc\u06ba \u0633\u0648\u0626\u06af \u0628\u06be\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u06d4 <code>sync.Once<\/code> \u0628\u0631\u0637\u0631\u0641\u06cc \u06a9\u0648 \u0628\u06d2 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u0627 <code>Stop<\/code> \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0628\u0627\u0631 \u06af\u06be\u0628\u0631\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0622\u067e \u06a9\u0627 \u0688\u0648\u067e\u0644\u06cc\u06a9\u0633 \u0686\u06cc\u0646\u0644 \u0628\u0646\u062f \u06c1\u06d2\u06d4 \u0634\u0679 \u0688\u0627\u0624\u0646 \u067e\u0627\u062a\u06be \u0627\u06a9\u062b\u0631 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u06c1\u06cc\u067e\u06cc \u067e\u0627\u062a\u06be \u0688\u06cc\u0645\u0648 \u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u062a\u0627\u0624 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-wake-workers-with-listennotify\">LISTEN\/NOTIFY \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u062c\u06af\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u06a9\u0627\u0631\u06a9\u0646 \u0645\u0633\u0644\u0633\u0644 \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u067e\u0648\u0644\u0646\u06af \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u06af\u0631 \u0642\u0637\u0627\u0631 \u062e\u0627\u0644\u06cc \u06c1\u06d2 \u062a\u0648 \u0648\u0633\u0627\u0626\u0644 \u0636\u0627\u0626\u0639 \u06c1\u0648 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 PostgreSQL \u06a9\u06d2 \u067e\u0627\u0633 \u06c1\u06d2\u06d4 <code>LISTEN\/NOTIFY<\/code> \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06a9\u0646\u06a9\u0634\u0646 \u0627\u06cc\u06a9 \u0686\u06cc\u0646\u0644 \u067e\u0631 \u0633\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-sql\">LISTEN swig_jobs;\n<\/code><\/pre>\n<p>\u0622\u067e \u062f\u0648\u0633\u0631\u06d2 \u0633\u06cc\u0634\u0646\u0632 \u0633\u06d2 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06be\u06cc\u062c \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-sql\">NOTIFY swig_jobs, '{\"id\":\"job-id\"}';\n<\/code><\/pre>\n<p>Swig \u0627\u06cc\u06a9 \u0679\u0631\u06af\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 PostgreSQL \u0679\u0627\u0633\u06a9 \u062f\u0627\u062e\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0627\u06cc\u06a9 \u0627\u0637\u0644\u0627\u0639 \u0628\u06be\u06cc\u062c \u0633\u06a9\u06d2\u06d4 \u062f\u0641\u062a\u0631\u06cc \u06a9\u0627\u0631\u06a9\u0646 \u0633\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u0627\u0648\u0631 \u062c\u0628 \u0646\u06cc\u0627 \u06a9\u0627\u0645 \u0622\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u062c\u0627\u06af \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u06a9\u0686\u06be \u0627\u06c1\u0645 PostgreSQL \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06c1\u06cc\u06ba: <code>LISTEN<\/code> \u0633\u06cc\u0634\u0646 \u06a9\u0627 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631\u06d4 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0627\u0633\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0633\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0633 \u067e\u0631 \u0648\u06c1 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>LISTEN<\/code>. Swig \u06c1\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0648\u0642\u0641 \u0633\u0627\u0645\u0639\u06cc\u0646 \u0628\u0646\u0627 \u06a9\u0631 \u0627\u0633 \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u067e\u0646\u06cc \u0632\u0646\u062f\u06af\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u06cc\u06a9 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0633\u06cc\u0634\u0646 \u06a9\u0627 \u0645\u0627\u0644\u06a9 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0628\u06cc\u06a9 \u0627\u06cc\u0646\u0688 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u06a9\u0627 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0633\u0628\u0642 \u06c1\u06d2\u06d4 \u06a9\u0646\u06a9\u0634\u0646 \u067e\u0648\u0644\u0632 \u062c\u06cc\u0633\u06d2 \u062a\u062c\u0631\u06cc\u062f \u06a9\u0627\u0631\u0622\u0645\u062f \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u06a9\u0686\u06be \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0645\u062e\u0635\u0648\u0635 \u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-elect-a-leader-with-advisory-locks\">\u0627\u06cc\u0688\u0648\u0627\u0626\u0632\u0631\u06cc \u0644\u0627\u06a9\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0644\u06cc\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06a9\u0686\u06be \u0642\u0637\u0627\u0631 \u06a9\u06cc \u062f\u06cc\u06a9\u06be \u0628\u06be\u0627\u0644 \u06a9\u06d2 \u06a9\u0627\u0645\u060c \u062c\u06cc\u0633\u06d2 \u06a9\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u0627\u060c \u067e\u0631\u0627\u0646\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06a9\u0631\u0646\u0627\u060c \u06cc\u0627 \u067e\u0631\u0627\u0646\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631\u0646\u0627\u060c \u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0645\u062b\u0627\u0644 \u067e\u0631 \u0686\u0644\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>Swig \u0627\u0633 \u0645\u0642\u0635\u062f \u06a9\u06d2 \u0644\u06cc\u06d2 PostgreSQL \u0627\u06cc\u0688\u0648\u0627\u0626\u0632\u0631\u06cc \u0644\u0627\u06a9\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-sql\">SELECT pg_try_advisory_lock($1);\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u062f\u0631\u0633\u062a \u06c1\u06d2 \u062a\u0648\u060c \u0648\u06c1 \u0633\u0648\u0626\u06af \u0645\u062b\u0627\u0644 \u0644\u06cc\u0688\u0631 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0634\u0627\u0648\u0631\u062a\u06cc \u062a\u0627\u0644\u06d2 \u0628\u06be\u06cc \u0633\u06cc\u0634\u0646 \u06a9\u06d2 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u0645\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 Swig \u0642\u06cc\u0627\u062f\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0648\u0642\u0641 \u0634\u062f\u06c1 \u0645\u0634\u0627\u0648\u0631\u062a\u06cc \u0644\u0627\u06a9 \u06a9\u0646\u06a9\u0634\u0646 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0648\u06c1 \u0633\u06cc\u0634\u0646 \u062e\u062a\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c PostgreSQL \u0644\u0627\u06a9 \u06a9\u0648 \u062c\u0627\u0631\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0645\u062b\u0627\u0644 \u0627\u0633 \u067e\u0631 \u0642\u0628\u0636\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 ZooKeeper \u06cc\u0627 etcd \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0633\u0627\u062f\u06c1 \u0641\u06cc\u0644 \u0627\u0648\u0648\u0631 \u0645\u0645\u06a9\u0646 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-handle-failed-jobs\">\u0646\u0627\u06a9\u0627\u0645 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u06af\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u063a\u0644\u0637\u06cc \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 Swig \u063a\u0644\u0637\u06cc \u06a9\u0648 \u0644\u0627\u06af \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06cc\u0627 \u062a\u0648 \u06a9\u0627\u0645 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0627\u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0634\u0627\u0646 \u0632\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-sql\">UPDATE swig_jobs\nSET status = CASE\n    WHEN attempts >= max_attempts THEN 'failed'\n    ELSE 'pending'\n  END,\n  last_error = $2,\n  last_error_at = NOW()\nWHERE id = $1;\n<\/code><\/pre>\n<h3 id=\"heading-a-note-on-delivery-semantics\">\u0679\u0631\u0627\u0646\u0633\u0641\u0631 \u0633\u06cc\u0645\u0646\u0679\u06a9\u0633 \u067e\u0631 \u0627\u06cc\u06a9 \u0646\u0648\u0679<\/h3>\n<p>\u0622\u067e \u06cc\u06c1 \u06a9\u06c1\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u0679\u0627\u0633\u06a9 \u06a9\u06cc\u0648 \u0627\u06cc\u06a9 \u0679\u0627\u0633\u06a9 \u06a9\u0648 \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u067e\u0631\u0648\u0633\u0633 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u06c1 \u0646\u0638\u0627\u0645 \u0645\u06cc\u06ba\u060c \u06cc\u06c1 \u0627\u06cc\u06a9 \u062e\u0637\u0631\u0646\u0627\u06a9 \u062f\u0644\u06cc\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0631\u062c \u0630\u06cc\u0644 \u0645\u0646\u0638\u0631 \u0646\u0627\u0645\u06d2 \u067e\u0631 \u063a\u0648\u0631 \u06a9\u0631\u06cc\u06ba:<\/p>\n<ol>\n<li>\n<p>\u0627\u06cc\u06a9 \u0645\u0644\u0627\u0632\u0645 \u0627\u06cc \u0645\u06cc\u0644 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0633\u06a9 \u0645\u06a9\u0645\u0644 \u06a9\u06d2 \u0628\u0637\u0648\u0631 \u0646\u0634\u0627\u0646 \u0632\u062f \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0631\u06cc\u0634 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0622\u067e \u06a9\u0627 \u0627\u06cc \u0645\u06cc\u0644 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u06be\u06cc\u062c\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u062f\u0631\u0633\u062a \u062a\u0641\u0635\u06cc\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0648\u0626\u06af \u0627\u06cc\u0679\u0645 \u0628\u0644\u0646\u06af \u0627\u0648\u0631 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0631\u06a9\u0646\u0627\u0646 \u06a9\u0648 \u06a9\u0645\u0632\u0648\u0631 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0627\u0645 \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0628\u0627\u0631 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u0648\u06c1\u06cc \u0646\u062a\u0627\u0626\u062c \u0628\u0631\u0622\u0645\u062f \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u06cc\u0633\u06d2 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-abstract-the-database-driver\">\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0688\u0631\u0627\u0626\u06cc\u0648\u0631\u0648\u06ba \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0633\u0648\u0626\u06af \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>pgx<\/code> \u0627\u0648\u0631 <code>database\/sql<\/code> \u0688\u0631\u0627\u0626\u06cc\u0648\u0631 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2:<\/p>\n<pre><code class=\"language-go\">type Driver interface {\n    Exec(ctx context.Context, sql string, args ...interface{}) error\n    Query(ctx context.Context, sql string, args ...interface{}) (Rows, error)\n    QueryRow(ctx context.Context, sql string, args ...interface{}) Row\n    WithTx(ctx context.Context, fn func(tx Transaction) error) error\n    NewListener(ctx context.Context, channel string) (Listener, error)\n    TryAdvisoryLock(ctx context.Context, lockID int64) (AdvisoryLock, bool, error)\n}\n<\/code><\/pre>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u06a9\u06cc\u0648 \u06a9\u0648\u0688 \u0635\u0631\u0641 \u0637\u0631\u0632 \u0639\u0645\u0644 \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0646\u06c1 \u06a9\u06c1 \u0645\u062e\u0635\u0648\u0635 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0648\u06ba \u067e\u0631\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u06af\u0648 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06c1\u06d2\u06d4 \u0628\u0646\u06cc\u0627\u062f\u06cc \u067e\u06cc\u06a9\u062c\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba\u060c \u0645\u062e\u0635\u0648\u0635 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u06be\u0648\u0679\u06d2 \u0627\u0688\u0627\u067e\u0679\u0631 \u0644\u06a9\u06be\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u0646\u0637\u0642 \u06a9\u0648 \u0622\u0632\u0627\u062f \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>PostgreSQL \u0633\u067e\u0648\u0631\u0679 \u06a9\u06cc \u0642\u0637\u0627\u0631\u06cc\u06ba \u062a\u0645\u0627\u0645 \u0633\u0633\u0679\u0645\u0632 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u0628\u0691\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0627\u06cc\u0648\u0646\u0679 \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u062a\u0648\u060c \u06a9\u0627\u0641\u06a9\u0627 \u0628\u06c1\u062a\u0631 \u0641\u0679 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u0631\u0648\u0679\u0646\u06af \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u062a\u0648\u060c RabbitMQ \u0628\u06c1\u062a\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c \u0628\u06c1\u062a \u0633\u06cc \u06af\u0648 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 PostgreSQL \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4 Swig \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06d2 Go API \u0627\u0648\u0631 \u06a9\u0686\u06be PostgreSQL \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u062a\u0646\u06cc \u062f\u0648\u0631 \u062c\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ul>\n<li>\n<p>\u06a9\u0627\u0645 \u06a9\u0648 \u0645\u06cc\u0632 \u067e\u0631 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u062c\u0648\u06c1\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0627 \u062f\u0639\u0648\u06cc \u06a9\u0631\u06cc\u06ba\u06d4 <code>FOR UPDATE SKIP LOCKED<\/code><\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u0633\u0631\u0634\u0627\u0631 \u0639\u0645\u0644\u06d2 \u06a9\u0648 \u0628\u06cc\u062f\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 <code>LISTEN\/NOTIFY<\/code> \u0633\u06cc\u0634\u0646<\/p>\n<\/li>\n<li>\n<p>\u0645\u0634\u0627\u0648\u0631\u062a\u06cc \u0644\u0627\u06a9 \u0688\u0627\u0624\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0642\u06cc\u0627\u062f\u062a \u06a9\u06cc \u0635\u0641 \u0628\u0646\u062f\u06cc \u06a9\u0631\u0646\u0627<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u067e \u0688\u06cc\u0679\u0627 \u0627\u0648\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0631\u06a9\u06be\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>\u06af\u0648\u0631\u0648\u0679\u06cc\u0646\u0632 \u0627\u0648\u0631 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0648\u0631\u06a9\u0631 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679<\/p>\n<\/li>\n<\/ul>\n<p>\u06cc\u06c1 \u0645\u062c\u0645\u0648\u0639\u06c1 \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0679\u06be\u0648\u0633 \u0628\u0646\u06cc\u0627\u062f \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06cc\u06c1 \u0633\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 Go \u0627\u0648\u0631 PostgreSQL \u06a9\u0633 \u0637\u0631\u062d \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0633\u0633\u0679\u0645 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e github.com\/glamboyosa\/swig \u067e\u0631 \u0645\u06a9\u0645\u0644 \u0633\u0648\u0631\u0633 \u06a9\u0648\u0688 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/p><\/div>","protected":false},"excerpt":{"rendered":"<p>\u0648\u06cc\u0628 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0646\u0627\u062a\u06d2 \u0648\u0642\u062a\u060c \u062a\u0645\u0627\u0645 \u06a9\u0627\u0645 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06a9\u0686\u06be \u0622\u067e\u0631\u06cc\u0634\u0646 \u0633\u0633\u062a \u06c1\u06cc\u06ba\u06d4 \u06a9\u0686\u06be \u0622\u067e\u0631\u06cc\u0634\u0646 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0686\u06be \u06a9\u0627\u0645 \u0628\u0639\u062f \u0645\u06cc\u06ba \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4 \u0627\u06cc \u0645\u06cc\u0644\u0632 \u0628\u06be\u06cc\u062c\u0646\u0627\u060c \u0627\u0645\u06cc\u062c\u0632 \u06a9\u0627 \u0633\u0627\u0626\u0632 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627\u060c \u0648\u06cc\u0628 \u06c1\u06a9\u0633 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u0627\u060c \u0631\u067e\u0648\u0631\u0679\u0633 \u0628\u0646\u0627\u0646\u0627\u060c \u0627\u0648\u0631 \u062a\u06be\u0631\u0688 \u067e\u0627\u0631\u0679\u06cc APIs \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0622\u0632\u0645\u0627\u0646\u0627 \u06cc\u06c1 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-25196","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/25196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=25196"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/25196\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=25196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=25196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=25196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}