{"id":22490,"date":"2026-04-14T23:59:44","date_gmt":"2026-04-14T23:59:44","guid":{"rendered":"https:\/\/umang.pk\/2026\/04\/14\/%d8%b3%d8%b1%d9%88%d8%b3-%d9%b9%d9%88-%d8%b3%d8%b1%d9%88%d8%b3-%d9%85%d9%88%d8%a7%d8%b5%d9%84%d8%a7%d8%aa-rest%d8%8c-grpc%d8%8c-%d8%a7%d9%88%d8%b1-%d8%a7%db%8c%d9%88%d9%86%d9%b9-%d9%be%d8%b1-%d9%85\/"},"modified":"2026-04-14T23:59:44","modified_gmt":"2026-04-14T23:59:44","slug":"%d8%b3%d8%b1%d9%88%d8%b3-%d9%b9%d9%88-%d8%b3%d8%b1%d9%88%d8%b3-%d9%85%d9%88%d8%a7%d8%b5%d9%84%d8%a7%d8%aa-rest%d8%8c-grpc%d8%8c-%d8%a7%d9%88%d8%b1-%d8%a7%db%8c%d9%88%d9%86%d9%b9-%d9%be%d8%b1-%d9%85","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/04\/14\/%d8%b3%d8%b1%d9%88%d8%b3-%d9%b9%d9%88-%d8%b3%d8%b1%d9%88%d8%b3-%d9%85%d9%88%d8%a7%d8%b5%d9%84%d8%a7%d8%aa-rest%d8%8c-grpc%d8%8c-%d8%a7%d9%88%d8%b1-%d8%a7%db%8c%d9%88%d9%86%d9%b9-%d9%be%d8%b1-%d9%85\/","title":{"rendered":"\u0633\u0631\u0648\u0633 \u0679\u0648 \u0633\u0631\u0648\u0633 \u0645\u0648\u0627\u0635\u0644\u0627\u062a: REST\u060c gRPC\u060c \u0627\u0648\u0631 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0631\u0633\u0627\u0646\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0628 \u06a9\u0631\u06cc\u06ba\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0645\u0648\u0627\u0635\u0644\u0627\u062a\u06cc \u067e\u0631\u062a \u06a9\u0626\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0641\u06cc\u0635\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0679\u06cc\u0645\u06cc\u06ba \u06a9\u0633 \u0637\u0631\u062d \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0646\u0627\u06a9\u0627\u0645\u06cc\u0627\u06ba \u06a9\u06cc\u0633\u06d2 \u067e\u06be\u06cc\u0644\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06c1\u0631 \u0628\u0627\u0631 \u0645\u0639\u0627\u06c1\u062f\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u06a9\u062a\u0646\u0627 \u062f\u0631\u062f \u0645\u062d\u0633\u0648\u0633 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u06cc\u0646 \u0627\u06c1\u0645 \u0646\u0645\u0648\u0646\u06d2 \u06c1\u06cc\u06ba: HTTP \u067e\u0631 REST\u060c \u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0628\u0641\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be gRPC\u060c \u0627\u0648\u0631 \u0628\u0631\u0648\u06a9\u0631\u0632 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0631\u0633\u0627\u0646\u06cc\u06d4 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0646\u0638\u0627\u0645 \u062a\u06cc\u0646\u0648\u06ba \u06a9\u0627 \u0645\u0631\u06a9\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0646\u0631 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u06d2 \u0646\u0645\u0648\u0646\u06d2 \u06a9\u0646 \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u0645\u06cc\u06ba\u060c \u0622\u067e \u06c1\u0631 \u0645\u0648\u0627\u0635\u0644\u0627\u062a\u06cc \u0627\u0646\u062f\u0627\u0632 \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u060c \u0627\u0646 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u067e\u0627\u0646\u0686 \u062c\u06c1\u062a\u0648\u06ba (\u062f\u06cc\u0631\u062a\u0627\u060c \u062c\u0648\u0691\u06d2\u060c \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0631\u062a\u0642\u0627\u0621\u060c \u0688\u06cc\u0628\u06af\u0646\u06af\u060c \u0627\u0648\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc) \u0645\u06cc\u06ba \u0639\u0645\u0644\u06cc \u062a\u062c\u0627\u0631\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06c1\u0631 \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u062a\u0639\u0627\u0645\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0646\u0627\u0633\u0628 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u06cc\u0635\u0644\u06c1 \u0633\u0627\u0632\u06cc \u06a9\u0627 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9\u06d4<\/p>\n<h3 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h3>\n<p>\u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0641\u0627\u0626\u062f\u06c1 \u0627\u0679\u06be\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc HTTP \u062a\u0635\u0648\u0631\u0627\u062a (\u062f\u0631\u062e\u0648\u0627\u0633\u062a\/\u062c\u0648\u0627\u0628\u060c \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688\u0632\u060c \u06c1\u06cc\u0688\u0631)<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0633\u06cc \u0628\u06be\u06cc \u0628\u06cc\u06a9 \u0627\u06cc\u0646\u0688 \u0632\u0628\u0627\u0646 \u0645\u06cc\u06ba API \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u06cc\u06ba (\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 TypeScript \u0627\u0648\u0631 Node.js \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba)<\/p>\n<\/li>\n<li>\n<p>\u0645\u0627\u0626\u06cc\u06a9\u0631\u0648 \u0633\u0631\u0648\u0633 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06cc \u0639\u0645\u0648\u0645\u06cc \u062a\u0641\u06c1\u06cc\u0645<\/p>\n<\/li>\n<li>\n<p>JSON \u06a9\u0627 \u0639\u0644\u0645\u060c \u0627\u06cc\u06a9 \u0688\u06cc\u0679\u0627 \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c \u0641\u0627\u0631\u0645\u06cc\u0679\u06d4<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-the-three-patterns-at-a-glance\">\u062a\u06cc\u0646 \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06af\u06c1\u0631\u0627\u0626\u06cc \u0645\u06cc\u06ba \u063a\u0648\u0637\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06cc\u06c1 \u0646\u0638\u0627\u0631\u06c1 \u06c1\u06d2:<\/p>\n<table>\n<thead>\n<tr>\n<th\/>\n<th>\u0628\u0627\u0642\u06cc<\/th>\n<th>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/th>\n<th>\u0648\u0627\u0642\u0639\u06c1 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u0645\u0648\u0627\u0635\u0644\u0627\u062a<\/strong><\/td>\n<td>\u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632<\/td>\n<td>\u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632 (+ \u0633\u0644\u0633\u0644\u06c1 \u0628\u0646\u062f\u06cc)<\/td>\n<td>\u0645\u062a\u0636\u0627\u062f<\/td>\n<\/tr>\n<tr>\n<td><strong>\u06a9\u0648\u0688<\/strong><\/td>\n<td>HTTP\/1.1 \u06cc\u0627 HTTP\/2<\/td>\n<td>HTTP\/2<\/td>\n<td>\u0628\u0631\u0648\u06a9\u0631 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 (TCP)<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646<\/strong><\/td>\n<td>JSON (\u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631)<\/td>\n<td>\u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0628\u0641\u0631 (\u0628\u0627\u0626\u0646\u0631\u06cc)<\/td>\n<td>JSON\u060c Avro\u060c Protoboof<\/td>\n<\/tr>\n<tr>\n<td><strong>\u06a9\u0646\u06a9\u0634\u0646<\/strong><\/td>\n<td>\u0648\u0642\u062a \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba<\/td>\n<td>\u0648\u0642\u062a + \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<td>\u0639\u0627\u0631\u0636\u06cc \u0688\u06cc\u06a9\u067e\u0644\u0646\u06af<\/td>\n<\/tr>\n<tr>\n<td><strong>\u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2\u06d4<\/strong><\/td>\n<td>\u0639\u0648\u0627\u0645\u06cc API\u060c CRUD<\/td>\n<td>\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0627\u0639\u0644\u06cc \u062a\u06be\u0631\u0648 \u067e\u0679<\/td>\n<td>\u0648\u0631\u06a9 \u0641\u0644\u0648\u060c \u0627\u06cc\u0648\u0646\u0679 \u0633\u0648\u0631\u0633\u0646\u06af<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u0637\u0627\u0642\u062a\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0639\u0627\u0644\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u06c1\u062a\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u06a9\u0627 \u0628\u0642\u06cc\u06c1 \u062d\u0635\u06c1 \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-rest-the-default-choice\">REST: \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0627\u0646\u062a\u062e\u0627\u0628<\/h2>\n<p>REST \u0627\u0648\u0648\u0631 HTTP \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u0645\u062c\u06be\u0627 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0645\u0648\u0627\u0635\u0644\u0627\u062a\u06cc \u0646\u0645\u0648\u0646\u06c1 \u06c1\u06d2\u06d4 \u0633\u0631\u0648\u0633\u0632 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u0648\u06ba \u067e\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0645\u0639\u06cc\u0627\u0631\u06cc HTTP \u0637\u0631\u06cc\u0642\u0648\u06ba \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062a\u0639\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Order service calls the inventory service\nasync function checkInventory(productId: string): Promise<inventorystatus> {\n  const response = await fetch(\n    `https:\/\/inventory-service\/api\/v1\/products\/${productId}\/stock`,\n    {\n      method: \"GET\",\n      headers: {\n        \"Content-Type\": \"application\/json\",\n        Authorization: `Bearer ${getServiceToken()}`,\n      },\n    }\n  );\n\n  if (!response.ok) {\n    throw new HttpError(response.status, await response.text());\n  }\n\n  return response.json();\n}\n<\/inventorystatus><\/code><\/pre>\n<h3 id=\"heading-where-rest-excels\">\u062c\u06c1\u0627\u06ba REST \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06c1\u06d2\u06d4<\/h3>\n<p>\u062a\u0645\u0627\u0645 \u0632\u0628\u0627\u0646\u06cc\u06ba\u060c \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9\u060c \u0627\u0648\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 HTTP \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0641\u0631\u0646\u0679\u0646\u0688\u0632\u060c \u0645\u0648\u0628\u0627\u0626\u0644 \u0627\u06cc\u067e\u0633\u060c \u067e\u0627\u0631\u0679\u0646\u0631 \u0627\u0646\u0679\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632\u060c \u0627\u0648\u0631 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0633\u0631\u0648\u0633\u0632 \u0633\u0628 \u0627\u06cc\u06a9 \u06c1\u06cc \u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0648\u0632\u0627\u0631 \u0628\u06be\u06cc \u0628\u0627\u0644\u063a \u06c1\u06cc\u06ba\u06d4 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631\u0632\u060c API \u06af\u06cc\u0679 \u0648\u06cc\u0632\u060c \u06a9\u06cc\u0634\u0646\u06af \u067e\u0631\u0627\u06a9\u0633\u06cc\u060c \u0627\u0648\u0631 \u0688\u06cc\u0628\u06af\u0646\u06af \u0679\u0648\u0644\u0632 \u0633\u0628\u06be\u06cc \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 HTTP \u06a9\u0648 \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0646\u0633\u0628\u062a\u0627\u064b \u0622\u0633\u0627\u0646 \u0628\u06be\u06cc \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0627\u06cc\u06a9 REST \u06a9\u0627\u0644 \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u0645\u062c\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u0627\u06cc\u06a9 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 HTTP \u0637\u0631\u06cc\u0642\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688 \u0646\u062a\u06cc\u062c\u06c1 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0627\u0633\u06a9\u06cc\u0645\u0627 \u062a\u0627\u0644\u06cc\u0641 \u06a9\u06d2 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u06a9\u0648\u0688 \u062c\u0646\u0631\u06cc\u0634\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06a9\u0633\u06cc \u062e\u0627\u0635 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0639\u0644\u0627\u0648\u06c1 HTTP \u0645\u06cc\u06ba \u0628\u0644\u0679 \u0627\u0646 \u06a9\u06cc\u0634\u0646\u06af \u0633\u06cc\u0645\u0646\u0679\u06a9\u0633 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>GET \/products\/123<\/code> \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0648\u0627\u0628 \u062f\u06cc\u06ba\u06d4 <code>Cache-Control: max-age=60<\/code> \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u0648\u0631 \u0633\u0631\u0648\u0631 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u067e\u0631\u0627\u06a9\u0633\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06c1\u06cc\u0688\u0631 \u06a9\u06cc\u0634 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 gRPC \u0627\u0648\u0631 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u067e\u06cc\u0679\u0631\u0646 \u0645\u06cc\u06ba \u0645\u0633\u0627\u0648\u06cc \u0628\u0644\u0679 \u0627\u0646 \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ REST response with cache headers\napp.get(\"\/api\/v1\/products\/:id\", async (req, res) => {\n  const product = await getProduct(req.params.id);\n\n  res.set(\"Cache-Control\", \"public, max-age=60\");\n  res.set(\"ETag\", computeETag(product));\n\n  res.json(product);\n});\n<\/code><\/pre>\n<h3 id=\"heading-where-rest-falls-short\">\u062c\u06c1\u0627\u06ba REST \u06a9\u06cc \u06a9\u0645\u06cc \u06c1\u06d2\u06d4<\/h3>\n<p>REST \u06a9\u06d2 \u0648\u0633\u0627\u0626\u0644 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0627\u06a9\u062b\u0631 \u062c\u0648\u0627\u0628 \u062c\u0645\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062a\u0639\u062f\u062f \u062f\u0648\u0631\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u0633\u06cc \u0622\u0631\u0688\u0631 \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0622\u0626\u0679\u0645\u0632\u060c \u06a9\u0633\u0679\u0645\u0631 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0627\u0648\u0631 \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u062a\u06cc\u0646 \u0627\u0644\u06af \u0627\u0644\u06af HTTP \u06a9\u0627\u0644\u0632 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u06a9\u0627\u0644 \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u0644\u06cc\u0679\u0646\u0633\u06cc\u060c TCP \u06c1\u06cc\u0646\u0688 \u0634\u06cc\u06a9 \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688\u060c \u0627\u0648\u0631 \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646 \u06a9\u06d2 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Three sequential calls to build one view\nasync function getOrderDetails(orderId: string): Promise<orderdetails> {\n  const order = await fetch(`\/api\/orders\/${orderId}`).then((r) => r.json());\n  const customer = await fetch(`\/api\/customers\/${order.customerId}`).then((r) => r.json());\n  const shipment = await fetch(`\/api\/shipments\/${order.shipmentId}`).then((r) => r.json());\n\n  return { order, customer, shipment };\n}\n<\/orderdetails><\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0645\u067e\u0648\u0632\u0679 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06cc\u0627 \u06af\u0631\u0627\u0641 \u06a9\u06cc\u0648 \u0627\u06cc\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06a9\u06d2 \u0627\u0633 \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u0633\u06d2 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0628\u0691\u06be \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 gRPC \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06cc \u0633\u0627\u062e\u062a \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0642\u062f\u0631\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646 \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4 JSON \u0627\u0646\u0633\u0627\u0646\u06cc \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0631\u0646\u0627 \u0645\u06c1\u0646\u06af\u0627 \u06c1\u06d2\u06d4 \u06c1\u0627\u0626\u06cc \u062a\u06be\u0631\u0648 \u067e\u0679 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0645\u0648\u0627\u0635\u0644\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u06c1\u0627\u06ba \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u067e\u06d2 \u0644\u0648\u0688 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0622\u067e CPU \u0627\u0648\u0631 \u0628\u06cc\u0646\u0688\u0648\u062a\u06be \u067e\u0631 \u0679\u06cc\u06a9\u0633 \u0627\u062f\u0627 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u0648\u06ba \u06af\u06d2 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0633 \u06a9\u06cc \u0622\u067e \u06a9\u0648 \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u0633\u0644\u0633\u0644\u06c1 \u0628\u0646\u062f\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2. \u0645\u0639\u06cc\u0627\u0631\u06cc REST \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u062c\u0648\u0627\u0628 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0633\u0631\u0648\u0631 \u06a9\u0648 \u06a9\u0644\u0627\u0626\u0646\u0679\u0633 \u062a\u06a9 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 (\u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0622\u0631\u0688\u0631 \u0679\u0631\u06cc\u06a9\u0646\u06af\u060c \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0645\u06cc\u0679\u0631\u06a9\u0633)\u060c REST \u06a9\u0648 \u06a9\u0627\u0645 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u062c\u06cc\u0633\u06d2 \u06a9\u06c1 \u067e\u0648\u0644\u0646\u06af\u060c \u0633\u0631\u0648\u0631 \u06a9\u06d2 \u0628\u06be\u06cc\u062c\u06d2 \u06af\u0626\u06d2 \u0627\u06cc\u0648\u0646\u0679\u0633\u060c \u06cc\u0627 WebSockets\u06d4 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u062e\u0648\u062f REST \u0645\u0627\u0688\u0644 \u06a9\u0627 \u062d\u0635\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-grpc-the-performance-choice\">gRPC: \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u06d2 \u0627\u0646\u062a\u062e\u0627\u0628<\/h2>\n<p>gRPC \u0627\u06cc\u06a9 \u0631\u06cc\u0645\u0648\u0679 \u067e\u0631\u0648\u0633\u06cc\u062c\u0631 \u06a9\u0627\u0644 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u06c1\u06d2 \u062c\u0648 HTTP\/2 \u0627\u0648\u0631 \u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0628\u0641\u0631\u0632 \u067e\u0631 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 URLs \u0627\u0648\u0631 JSON \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0622\u067e \u0633\u0631\u0648\u0633\u0632 \u0627\u0648\u0631 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>.proto<\/code> \u0622\u067e \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0645\u0636\u0628\u0648\u0637\u06cc \u0633\u06d2 \u0679\u0627\u0626\u067e \u0634\u062f\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0627\u0648\u0631 \u0633\u0631\u0648\u0631 \u06a9\u0648\u0688 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-defining-the-contract\">\u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641<\/h3>\n<pre><code class=\"language-protobuf\">\/\/ inventory.proto\nsyntax = \"proto3\";\n\npackage inventory;\n\nservice InventoryService {\n  \/\/ Unary: single request, single response\n  rpc CheckStock(StockRequest) returns (StockResponse);\n\n  \/\/ Server streaming: single request, stream of responses\n  rpc WatchStockLevels(WatchRequest) returns (stream StockUpdate);\n\n  \/\/ Client streaming: stream of requests, single response\n  rpc BulkUpdateStock(stream StockAdjustment) returns (BulkUpdateResult);\n}\n\nmessage StockRequest {\n  string product_id = 1;\n  string warehouse_id = 2;\n}\n\nmessage StockResponse {\n  string product_id = 1;\n  int32 available = 2;\n  int32 reserved = 3;\n  google.protobuf.Timestamp last_updated = 4;\n}\n\nmessage StockUpdate {\n  string product_id = 1;\n  int32 available = 2;\n  string warehouse_id = 3;\n}\n<\/code><\/pre>\n<p>\u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f <code>protoc<\/code> (\u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0628\u0641\u0631 \u06a9\u0645\u067e\u0627\u0626\u0644\u0631) \u0622\u067e \u06a9\u06cc \u0679\u0627\u0631\u06af\u0679 \u0644\u06cc\u0646\u06af\u0648\u06cc\u062c \u0645\u06cc\u06ba \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0627\u0648\u0631 \u0633\u0631\u0648\u0631 \u0627\u0633\u0679\u0628\u0633 \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 TypeScript \u06a9\u0644\u0627\u0626\u0646\u0679 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">import { InventoryServiceClient } from \".\/generated\/inventory\";\nimport { credentials } from \"@grpc\/grpc-js\";\n\nconst client = new InventoryServiceClient(\n  \"inventory-service:50051\",\n  credentials.createInsecure()\n);\n\nasync function checkStock(productId: string): Promise<stockresponse> {\n  return new Promise((resolve, reject) => {\n    client.checkStock(\n      { productId, warehouseId: \"warehouse-eu-1\" },\n      (error, response) => {\n        if (error) reject(error);\n        else resolve(response);\n      }\n    );\n  });\n}\n<\/stockresponse><\/code><\/pre>\n<h3 id=\"heading-where-grpc-excels\">\u062c\u06c1\u0627\u06ba \u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06c1\u06d2\u06d4<\/h3>\n<p>\u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0628\u0641\u0631\u0632 \u06a9\u0648 \u06a9\u0645\u067e\u06cc\u06a9\u0679 \u0628\u0627\u0626\u0646\u0631\u06cc \u0641\u0627\u0631\u0645\u06cc\u0679 \u0645\u06cc\u06ba \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 JSON \u0645\u06cc\u06ba 1KB \u06a9\u0627 \u067e\u06cc\u063a\u0627\u0645 Protobuf \u0645\u06cc\u06ba 300 \u0628\u0627\u0626\u0679\u0633 \u06a9\u0627 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 HTTP\/2 \u0645\u0644\u0679\u06cc \u067e\u0644\u06cc\u06a9\u0633\u0646\u06af (\u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f TCP \u06a9\u0646\u06a9\u0634\u0646 \u067e\u0631 \u0645\u062a\u0639\u062f\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba) \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0644 \u06a9\u0631\u060c gRPC \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0633\u0631\u0648\u0633 \u06a9\u0627\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 REST \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u06a9\u0645 \u0644\u06cc\u0679\u0646\u0633\u06cc \u0627\u0648\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u06be\u0631\u0648 \u067e\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u06c1\u0645 \u0633\u0628 \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u0627\u06c1\u0645\u06cc\u062a \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0645\u06cc\u0679\u0631\u06a9 \u0646\u0638\u0627\u0645<\/th>\n<th>REST (JSON\/HTTP 1.1)<\/th>\n<th>gRPC (Protobuf\/HTTP 2)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646 \u0633\u0627\u0626\u0632<\/td>\n<td>\u0628\u0691\u0627 (\u0645\u062a\u0646 \u067e\u0631 \u0645\u0628\u0646\u06cc JSON)<\/td>\n<td>\u06a9\u0627\u0641\u06cc \u0686\u06be\u0648\u0679\u0627 (\u0628\u0627\u0626\u0646\u0631\u06cc \u067e\u0631\u0648\u0679\u0648\u0628\u0641)<\/td>\n<\/tr>\n<tr>\n<td>\u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646 \u06a9\u0627 \u0648\u0642\u062a<\/td>\n<td>\u0622\u06c1\u0633\u062a\u06c1 (JSON \u067e\u0627\u0631\u0633\u0646\u06af\/\u0633\u0679\u0631\u0646\u06af\u0646\u06af)<\/td>\n<td>\u062a\u06cc\u0632 \u062a\u0631 (\u0628\u0627\u0626\u0646\u0631\u06cc \u0627\u0646\u06a9\u0648\u0688\u0646\u06af\/\u0688\u06cc \u06a9\u0648\u0688\u0646\u06af)<\/td>\n<\/tr>\n<tr>\n<td>\u0641\u06cc \u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba\u06d4<\/td>\n<td>1 (\u06a9\u0648\u0626\u06cc \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0646\u06c1\u06cc\u06ba)<\/td>\n<td>\u0645\u0644\u0679\u06cc \u067e\u0644\u06cc\u06a9\u0633\u0646\u06af<\/td>\n<\/tr>\n<tr>\n<td>\u0627\u0648\u067e\u0631 \u06a9\u0646\u06a9\u0634\u0646<\/td>\n<td>\u0646\u0626\u06d2 \u06a9\u0646\u06a9\u0634\u0646 \u0641\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a (HTTP\/1.1)<\/td>\n<td>\u0645\u0644\u0679\u06cc \u067e\u0644\u06cc\u06a9\u0633\u0646\u06af \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0633\u0644\u0633\u0644 \u0631\u0627\u0628\u0637\u06c1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u067e\u06d2 \u0644\u0648\u0688 \u0633\u0627\u0626\u0632\u060c \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u0679\u0648\u067e\u0648\u0644\u0648\u062c\u06cc\u060c \u0627\u0648\u0631 \u0633\u0631\u0648\u0631 \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0628\u06c1\u062a\u0631\u06cc \u06a9\u06cc \u0635\u062d\u06cc\u062d \u0645\u0642\u062f\u0627\u0631 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648\u06af\u06cc\u06d4 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9\u0633 \u0645\u06cc\u06ba\u060c \u0641\u0631\u0642 \u0646\u06c1 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0631\u0627\u0628\u0631 (\u062a\u06cc\u0632 \u0646\u06cc\u0679 \u0648\u0631\u06a9\u0633 \u067e\u0631 \u0686\u06be\u0648\u0679\u06d2 \u067e\u06d2 \u0644\u0648\u0688\u0632) \u0633\u06d2 \u0644\u06d2 \u06a9\u0631 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 (\u0628\u0691\u06d2 \u067e\u06d2 \u0644\u0648\u0688\u060c \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc) \u062a\u06a9 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u0627\u06cc\u0627\u0646 \u0644\u0627\u0626\u0646: gRPC \u06a9\u06cc \u0628\u0627\u0626\u0646\u0631\u06cc \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646 \u0627\u0648\u0631 HTTP\/2 \u0645\u0644\u0679\u06cc \u067e\u0644\u06cc\u06a9\u0633\u0646\u06af \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0627\u062e\u062a\u06cc \u0641\u0648\u0627\u0626\u062f \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0622\u067e \u06a9\u0648 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u06d2 \u062f\u0639\u0648\u06d2 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u067e\u0646\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u062a\u0627\u062e\u06cc\u0631 \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c gRPC \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0686\u0627\u0631 \u0645\u0648\u0627\u0635\u0644\u0627\u062a\u06cc \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2: \u06cc\u0648\u0646\u0631\u06cc (\u062f\u0631\u062e\u0648\u0627\u0633\u062a-\u062c\u0648\u0627\u0628)\u060c \u0633\u0631\u0648\u0631 \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af\u060c \u06a9\u0644\u0627\u0626\u0646\u0679 \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af\u060c \u0627\u0648\u0631 \u062f\u0648 \u0637\u0631\u0641\u06c1 \u0633\u0644\u0633\u0644\u06c1 \u0628\u0646\u062f\u06cc\u06d4 \u06cc\u06c1 \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u062c\u06cc\u0633\u06d2 \u06a9\u06c1 \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u0627\u067e \u0688\u06cc\u0679\u0633\u060c \u0644\u0627\u06af \u0679\u06cc\u0644\u0646\u06af\u060c \u06cc\u0627 \u067e\u0631\u0648\u06af\u0631\u06cc\u0633 \u0631\u067e\u0648\u0631\u0679\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0641\u0637\u0631\u06cc \u0641\u0679 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Server streaming: watch inventory changes in real time\nfunction watchStockLevels(warehouseId: string): void {\n  const stream = client.watchStockLevels({ warehouseId });\n\n  stream.on(\"data\", (update: StockUpdate) => {\n    console.log(`Product \\({update.productId}: \\){update.available} available`);\n  });\n\n  stream.on(\"error\", (error) => {\n    console.error(\"Stream error:\", error.message);\n    \/\/ Reconnect logic here\n  });\n\n  stream.on(\"end\", () => {\n    console.log(\"Stream ended\");\n  });\n}\n<\/code><\/pre>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0627\u067e\u0646\u06cc \u062a\u0645\u0627\u0645 \u0633\u0631\u0648\u0633\u0632 \u0645\u06cc\u06ba \u0679\u0627\u0626\u067e\u0646\u06af \u06a9\u06cc \u0637\u0627\u0642\u062a\u0648\u0631 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u067e\u06cc\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u06c1 <code>.proto<\/code> \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u0622\u067e \u06a9\u06cc \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u06a9\u0627 \u0648\u0627\u062d\u062f \u0630\u0631\u06cc\u0639\u06c1 \u06c1\u06d2\u06d4 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0627\u0648\u0631 \u0633\u0631\u0648\u0631 \u062f\u0648\u0646\u0648\u06ba \u06cc\u06c1\u0627\u06ba \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u0633\u0631\u0648\u0633 \u0628\u062f\u0644 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 <code>StockResponse<\/code> \u062c\u0628 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062a\u0648\u060c \u0622\u0631\u0688\u0631\u0646\u06af \u0633\u0631\u0648\u0633 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u0622\u067e \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0644\u06cc\u062a\u06d2\u06d4 \u06cc\u06c1 3am \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u0628\u0644\u06a9\u06c1 \u0645\u0631\u062a\u0628 \u0648\u0642\u062a \u067e\u0631 \u0628\u0631\u06cc\u06a9\u0646\u06af \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-where-grpc-falls-short\">\u062c\u06c1\u0627\u06ba \u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc \u06a9\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u067e\u06c1\u0644\u0627 \u0628\u0691\u0627 \u0645\u0633\u0626\u0644\u06c1 \u0628\u0631\u0627\u0624\u0632\u0631 \u0633\u067e\u0648\u0631\u0679 \u06c1\u06d2\u06d4 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u0642\u0627\u0645\u06cc \u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc \u06a9\u0627\u0644\u0632 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>fetch<\/code> API HTTP\/2 \u0641\u0631\u06cc\u0645\u0646\u06af \u06a9\u0648 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc gRPC \u06a9\u0648 \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u062c\u06cc\u0633\u06d2 \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688\u0632 \u06a9\u06d2 \u0679\u0631\u06cc\u0644\u0631 \u0627\u0648\u0631 \u0627\u0646\u0679\u0631\u0627\u06cc\u06a9\u0679\u0648 \u0627\u0633\u0679\u0631\u06cc\u0645\u0632 \u067e\u0631 \u0639\u0645\u062f\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u0648 gRPC-Web \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u062c\u0648 GRPC \u06a9\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0633\u06d2 \u0645\u0637\u0627\u0628\u0642\u062a \u0631\u06a9\u06be\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0633\u0628 \u0633\u06cc\u0679 \u0627\u0648\u0631 \u0645\u06a9\u0645\u0644 \u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u062a\u0631\u062c\u0645\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 Envoy \u062c\u06cc\u0633\u06cc \u067e\u0631\u0627\u06a9\u0633\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u062a\u0628\u0627\u062f\u0644 \u0637\u0648\u0631 \u067e\u0631\u060c \u0622\u067e \u0627\u067e\u0646\u06cc gRPC \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 REST \u06cc\u0627 GraphQL \u06af\u06cc\u0679 \u0648\u06d2 \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0633\u06cc \u0628\u06be\u06cc \u0637\u0631\u062d \u0633\u06d2\u060c \u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc \u0627\u0646 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0627\u0628\u0644 \u0639\u0645\u0644 \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0628\u0631\u0627\u0624\u0632\u0631 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06cc \u0644\u06cc\u06d2 \u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u0645\u06cc\u06ba \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0627 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0639\u0648\u0627\u0645\u06cc APIs \u06a9\u06d2 \u0644\u06cc\u06d2 REST \u067e\u0631 \u0688\u06cc\u0641\u0627\u0644\u0679 \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u06cc\u0628\u06af \u06a9\u0631\u0646\u0627 \u0628\u06be\u06cc \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4 \u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 <code>curl<\/code> gRPC \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1\u06d4 \u0628\u0627\u0626\u0646\u0631\u06cc \u067e\u06d2 \u0644\u0648\u0688\u0632 \u0627\u0646\u0633\u0627\u0646\u06cc \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0627\u0648\u0632\u0627\u0631 \u062c\u06cc\u0633\u06d2 <code>grpcurl<\/code> \u067e\u0648\u0633\u0679 \u0645\u06cc\u0646 \u06a9\u06cc \u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc \u0633\u067e\u0648\u0631\u0679 \u0645\u062f\u062f \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0688\u06cc\u0628\u06af\u0646\u06af \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u06d2 \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u0679\u06cc\u0628 \u0645\u06cc\u06ba JSON \u062c\u0648\u0627\u0628 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0628\u06be\u06cc \u0628\u062f\u062a\u0631 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\"># Debugging a REST endpoint\ncurl -s https:\/\/inventory-service\/api\/v1\/products\/abc-123\/stock | jq\n\n# Debugging a gRPC endpoint (requires grpcurl)\ngrpcurl -plaintext -d '{\"product_id\": \"abc-123\"}' \\\n  inventory-service:50051 inventory.InventoryService\/CheckStock\n<\/code><\/pre>\n<p>\u0622\u062e\u0631 \u06a9\u0627\u0631\u060c \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u0627\u06cc\u06a9 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 <code>.proto<\/code> \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0628\u0644\u0688 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0645\u06cc\u06ba \u06a9\u0648\u0688 \u062c\u0646\u0631\u06cc\u0634\u0646 \u0686\u0644\u0627\u0626\u06cc\u06ba\u060c \u067e\u0631\u0648\u0679\u0648 \u0688\u06cc\u0641\u06cc\u0646\u06cc\u0634\u0646 \u06a9\u0627 \u0648\u0631\u0698\u0646 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u062f\u0648 \u062e\u062f\u0645\u0627\u062a \u0648\u0627\u0644\u06cc \u0679\u06cc\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06cc\u06c1 \u0642\u0627\u0628\u0644 \u0627\u0646\u062a\u0638\u0627\u0645 \u06c1\u06d2\u06d4 20 \u0633\u0631\u0648\u0633\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0631\u0648\u0679\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc \u0627\u0648\u0631 \u06af\u0648\u0631\u0646\u0646\u0633 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-event-driven-messaging-the-decoupling-choice\">\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0631\u0633\u0627\u0646\u06cc: \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628<\/h2>\n<p>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0645\u0648\u0627\u0635\u0644\u0627\u062a \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0633\u0631 \u067e\u0631 \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u0631\u0648\u0633 A \u06a9\u0627\u0644\u0646\u06af \u0633\u0631\u0648\u0633 B \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0633\u0631\u0648\u0633 A \u0627\u06cc\u06a9 \u0628\u0631\u0648\u06a9\u0631 (\u06a9\u0627\u0641\u06a9\u0627\u060c \u0631\u0628\u06cc\u0679 \u0627\u06cc\u0645 \u06a9\u06cc\u0648\u060c \u0627\u06cc\u0645\u06cc\u0632\u0648\u0646 SNS\/SQS\u060c \u0648\u063a\u06cc\u0631\u06c1) \u06a9\u0648 \u0627\u06cc\u0648\u0646\u0679\u0633 \u0634\u0627\u0626\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u0631\u0648\u0633 B \u0627\u0646\u06c1\u06cc\u06ba \u0645\u062a\u0636\u0627\u062f \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Order service publishes an event after confirming an order\nimport { Kafka } from \"kafkajs\";\n\nconst kafka = new Kafka({ brokers: [\"kafka:9092\"] });\nconst producer = kafka.producer();\n\nasync function publishOrderConfirmed(order: Order): Promise<void> {\n  await producer.send({\n    topic: \"order.confirmed\",\n    messages: [\n      {\n        key: order.id,\n        value: JSON.stringify({\n          eventType: \"order.confirmed\",\n          eventId: crypto.randomUUID(),\n          timestamp: new Date().toISOString(),\n          data: {\n            orderId: order.id,\n            customerId: order.customerId,\n            items: order.items.map((item) => ({\n              productId: item.productId,\n              quantity: item.quantity,\n            })),\n            total: order.total,\n          },\n        }),\n      },\n    ],\n  });\n}\n<\/void><\/code><\/pre>\n<pre><code class=\"language-typescript\">\/\/ Inventory service consumes the event independently\nconst consumer = kafka.consumer({ groupId: \"inventory-service\" });\n\nasync function startInventoryConsumer(): Promise<void> {\n  await consumer.subscribe({ topic: \"order.confirmed\" });\n\n  await consumer.run({\n    eachMessage: async ({ message }) => {\n      const event = JSON.parse(message.value.toString());\n\n      for (const item of event.data.items) {\n        await decrementStock(item.productId, item.quantity);\n      }\n\n      logger.info(\"Inventory updated for order\", {\n        orderId: event.data.orderId,\n      });\n    },\n  });\n}\n<\/void><\/code><\/pre>\n<h3 id=\"heading-where-event-driven-excels\">\u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679 \u0628\u06cc\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u062c\u06af\u06c1<\/h3>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u06c1 \u062f\u0646\u06cc\u0627\u0648\u06cc \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2. \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2\u06d4 &quot;\u0622\u0631\u0688\u0631 \u06a9\u0646\u0641\u0631\u0645\u06cc\u0634\u0646&#8221; \u067e\u0648\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0622\u0631\u0688\u0631 \u0633\u0631\u0648\u0633 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 \u0627\u06af\u0631 \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u0633\u0631\u0648\u0633 \u0645\u06cc\u06ba \u062e\u0644\u0644 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633 \u06a9\u06d2 \u0628\u062d\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u0628\u0631\u0648\u06a9\u0631 \u067e\u0631 \u062a\u0642\u0631\u06cc\u0628\u0627\u062a \u0645\u0646\u0639\u0642\u062f \u06a9\u06cc \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc\u06d4 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u06a9\u0648\u0626\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u0645\u0646\u0637\u0642 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u06a9\u0648\u0626\u06cc \u062c\u06be\u0691\u067e \u06a9\u06cc \u063a\u0644\u0637\u06cc\u0627\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0648\u0627\u0642\u0639\u06c1 \u0645\u062a\u0639\u062f\u062f \u0622\u0632\u0627\u062f \u0631\u062f\u0639\u0645\u0644 \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u0631\u0688\u0631 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u0633\u0631\u0648\u0633 \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u06a9\u0648 \u06a9\u0645 \u06a9\u0631 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u060c \u0646\u0648\u0679\u06cc\u0641\u06a9\u06cc\u0634\u0646 \u0633\u0631\u0648\u0633 \u0627\u06cc\u06a9 \u062a\u0635\u062f\u06cc\u0642\u06cc \u0627\u06cc \u0645\u06cc\u0644 \u0628\u06be\u06cc\u062c\u062a\u06cc \u06c1\u06d2\u060c \u062a\u062c\u0632\u06cc\u0627\u062a\u06cc \u0633\u0631\u0648\u0633 \u062a\u0628\u0627\u062f\u0644\u0648\u06ba \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0634\u067e\u0646\u06af \u0633\u0631\u0648\u0633 \u062a\u06a9\u0645\u06cc\u0644 \u06a9\u0627 \u0622\u063a\u0627\u0632 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0622\u0631\u0688\u0631\u0646\u06af \u0633\u0631\u0648\u0633 \u0627\u0646 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u06cc \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u0627\u0646 \u06a9\u06cc \u067e\u0631\u0648\u0627\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">order.confirmed event\n  \u251c\u2500\u2500 inventory-service    \u2192 Decrement stock\n  \u251c\u2500\u2500 notification-service \u2192 Send confirmation email\n  \u251c\u2500\u2500 analytics-service    \u2192 Record conversion\n  \u2514\u2500\u2500 shipping-service     \u2192 Create shipment\n<\/code><\/pre>\n<p>\u0646\u06cc\u0627 \u0635\u0627\u0631\u0641 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062e\u062f\u0645\u0627\u062a \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0633\u0628 \u0633\u06d2 \u06a9\u0645 \u0642\u0627\u0628\u0644 \u062d\u0635\u0648\u0644 \u062c\u0648\u0691\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0642\u062f\u0631\u062a\u06cc \u0622\u0688\u0679 \u0679\u0631\u06cc\u0644 \u0628\u06be\u06cc \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 \u0628\u0631\u0648\u06a9\u0631 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 (\u06a9\u0627\u0641\u06a9\u0627 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u0633\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2)\u060c \u062a\u0648 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062c\u0648 \u06a9\u0686\u06be \u0628\u06be\u06cc \u06c1\u0648\u0627 \u0627\u0633 \u06a9\u0627 \u0645\u06a9\u0645\u0644 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4 \u0622\u067e \u062d\u0627\u0644\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0688\u06cc\u0628\u06af \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u06cc \u062f\u0631\u0633\u062a \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06cc\u0627 \u062a\u0627\u0631\u06cc\u062e\u06cc \u0648\u0627\u0642\u0639\u0627\u062a \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0622\u0628\u0627\u062f \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u0626\u06cc \u0633\u0631\u0648\u0633\u0632 \u06a9\u0648 \u0627\u0633\u067e\u0646 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-where-event-driven-falls-short\">\u062c\u06c1\u0627\u06ba \u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc \u06a9\u0645\u06cc \u06c1\u06d2\u06d4<\/h3>\n<p>\u0622\u0631\u0688\u0631 \u0633\u0631\u0648\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0628 \u0633\u06d2 &#8216;\u0622\u0631\u0688\u0631 \u06a9\u0646\u0641\u0631\u0645\u06cc\u0634\u0646&#8217; \u067e\u0648\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0627\u06cc\u06a9 \u0648\u0646\u0688\u0648 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u06af\u06cc \u062c\u06c1\u0627\u06ba \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u0633\u0631\u0648\u0633 \u0646\u06d2 \u0627\u0628\u06be\u06cc \u062a\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u0645\u062f\u062a \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u067e\u0631\u0627\u0646\u06cc \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u06a9\u06cc \u0633\u0637\u062d\u0648\u06ba \u06a9\u0648 \u067e\u0691\u06be \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u0645\u06cc\u06ba &quot;\u0622\u067e \u062c\u0648 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0633\u06d2 \u067e\u0691\u06be\u06cc\u06ba&#8221; \u06a9\u06cc \u0645\u0633\u062a\u0642\u0644 \u0645\u0632\u0627\u062c\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u0635\u0631\u0641 \u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0645\u0648\u0627\u0635\u0644\u062a \u06a9\u0627\u0641\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ The problem: order confirmed, but stock not yet decremented\nasync function handleCheckout(cart: Cart): Promise<order> {\n  const order = await createOrder(cart);\n  await publishOrderConfirmed(order);\n\n  \/\/ If another request checks stock RIGHT NOW,\n  \/\/ it sees the old (pre-decrement) value.\n  \/\/ The inventory consumer hasn't processed the event yet.\n  return order;\n}\n<\/order><\/code><\/pre>\n<p>\u0688\u06cc\u0628\u06af\u0646\u06af \u0628\u06be\u06cc \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u06cc\u06a9 \u0679\u0631\u06cc\u0633 \u0627\u0633 \u0648\u0642\u062a \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632 \u06a9\u0627\u0644 \u0686\u06cc\u0646 \u0645\u06cc\u06ba \u0645\u0633\u0627\u0626\u0644 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062c\u0628 \u0648\u0627\u0642\u0639\u06c1 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0628\u06c1\u0627\u0624 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0645\u0633\u0626\u0644\u06c1 \u067e\u06cc\u0634 \u0622\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0688\u06cc\u0688 \u0644\u06cc\u0679\u0631 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u0648\u0627\u0644\u0627\u062a \u067e\u0648\u0686\u06be\u062a\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u06d2: \u06cc\u06c1 \u06a9\u0633 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u0646\u06d2 \u0628\u06be\u06cc\u062c\u0627\u061f \u06a9\u0628 \u0627\u0633 \u0648\u0642\u062a \u0646\u0638\u0627\u0645 \u06a9\u06cc \u06a9\u06cc\u0627 \u062d\u0627\u0644\u062a \u062a\u06be\u06cc\u061f \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u06c1 \u0679\u0631\u06cc\u0633\u0646\u06af \u0645\u06cc\u06ba \u0645\u062f\u062f \u0645\u0644\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062a\u0645\u0627\u0645 \u0633\u0631\u0648\u0633\u0632 \u0645\u06cc\u06ba \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0622\u067e\u0633 \u0645\u06cc\u06ba \u062c\u0648\u0691\u0646\u0627 \u0641\u0637\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u06a9\u06d2 \u06a9\u0627\u0644 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u06d2 \u0648\u0627\u0631\u0646\u0679\u06cc \u0622\u0631\u0688\u0631 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0645\u0633\u0626\u0644\u06c1 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0628\u0631\u0648\u06a9\u0631\u0632 \u067e\u0627\u0631\u0679\u06cc\u0634\u0646\u0632 (\u06a9\u0627\u0641\u06a9\u0627) \u06cc\u0627 \u0642\u0637\u0627\u0631\u0648\u06ba \u0645\u06cc\u06ba \u0622\u0631\u0688\u0631 \u062f\u06cc\u0646\u06d2 \u06a9\u06cc \u0636\u0645\u0627\u0646\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0639\u0627\u0644\u0645\u06cc \u0633\u0637\u062d \u067e\u0631 \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u0631\u0688\u0631 \u0633\u0631\u0648\u0633 &quot;\u0622\u0631\u0688\u0631 \u06a9\u0646\u0641\u0631\u0645\u06cc\u0634\u0646&#8221; \u0627\u0648\u0631 \u067e\u06be\u0631 &quot;\u0622\u0631\u0688\u0631 \u06a9\u06cc\u0646\u0633\u0644\u06cc\u0634\u0646&#8221; \u067e\u0648\u0633\u0679 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u06af\u0631 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0633\u06cc \u0627\u0648\u0631 \u067e\u0627\u0631\u0679\u06cc\u0634\u0646 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u0633\u0631\u0648\u0633 \u067e\u06c1\u0644\u06d2 \u0645\u0646\u0633\u0648\u062e\u06cc \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Use a consistent partition key to guarantee ordering per entity\nawait producer.send({\n  topic: \"order.events\",\n  messages: [\n    {\n      \/\/ All events for the same order go to the same partition\n      key: order.id,\n      value: JSON.stringify(event),\n    },\n  ],\n});\n<\/code><\/pre>\n<p>entity ID (\u0622\u0631\u0688\u0631 ID\u060c \u06a9\u0633\u0679\u0645\u0631 ID) \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u0648 \u06a9\u0644\u06cc\u062f\u06cc \u0628\u0646\u0627\u0646\u0627 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u06c1\u06cc \u06c1\u0633\u062a\u06cc \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u062a\u0631\u062a\u06cc\u0628 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u067e\u0631\u0648\u0633\u06cc\u0633 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u062e\u062a\u0644\u0641 \u0627\u062f\u0627\u0631\u0648\u06ba \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0645\u062a\u0648\u0627\u0632\u06cc \u0637\u0648\u0631 \u067e\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0686\u06cc\u0632\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba. \u067e\u06cc\u063a\u0627\u0645 \u0628\u0631\u0648\u06a9\u0631 \u0686\u0644\u0627\u0646\u0627 \u0645\u0641\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06a9\u0627\u0641\u06a9\u0627 \u06a9\u0648 ZooKeeper (\u06cc\u0627 KRaft)\u060c \u0679\u0627\u067e\u06a9 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679\u060c \u067e\u0627\u0631\u0679\u06cc\u0634\u0646 \u0631\u06cc \u0628\u06cc\u0644\u0646\u0633\u0646\u06af\u060c \u06a9\u0646\u0632\u06cc\u0648\u0645\u0631 \u06af\u0631\u0648\u067e \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646\u060c \u0627\u0648\u0631 \u06a9\u0646\u0632\u06cc\u0648\u0645\u0631 \u0644\u06cc\u0679\u06cc\u0646\u0633\u06cc \u0645\u0627\u0646\u06cc\u0679\u0631\u0646\u06af \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 Amazon MSK\u060c Confluent Cloud\u060c \u06cc\u0627 Amazon SQS \u062c\u06cc\u0633\u06cc \u0645\u0646\u0638\u0645 \u062e\u062f\u0645\u0627\u062a \u0627\u0633 \u0628\u0648\u062c\u06be \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba \u0644\u06cc\u06a9\u0646 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-handling-broker-failures\">\u0628\u0631\u0648\u06a9\u0631 \u06a9\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u0627<\/h3>\n<p>\u0627\u06af\u0631 \u0628\u0631\u0648\u06a9\u0631 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0646\u06c1 \u06c1\u0648 \u062a\u0648 \u06a9\u06cc\u0627 \u06c1\u0648\u06af\u0627\u061f \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0633\u0631\u0648\u0633 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0644\u06a9\u06be\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u06cc\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u0634\u0627\u0626\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u0628\u0631\u0648\u06a9\u0631 \u06a9\u06cc \u0628\u0646\u062f\u0634 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u0648\u0646\u0679 \u0636\u0627\u0626\u0639 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u0686\u0627\u06c1\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0644\u06a9\u06be\u0646\u0627 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0646\u0645\u0648\u0646\u06d2 \u0622\u067e \u06a9\u06cc \u0645\u062f\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<h4 id=\"heading-1-the-outbox-pattern\">1. \u0622\u0624\u0679 \u0628\u0627\u06a9\u0633 \u067e\u06cc\u0679\u0631\u0646<\/h4>\n<p>\u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0628\u0631\u0648\u06a9\u0631 \u06a9\u0648 \u067e\u0648\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u0627\u0633\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u0645\u06cc\u06ba &quot;\u0622\u0624\u0679 \u0628\u0627\u06a9\u0633&#8221; \u0679\u06cc\u0628\u0644 \u067e\u0631 \u0644\u0627\u06af \u0627\u0646 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0637\u0631\u062d \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0688\u06cc\u0679\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0627\u0644\u06af \u0639\u0645\u0644 (\u06cc\u0627 \u062a\u0648 \u067e\u0648\u0644\u0631 \u06cc\u0627 \u062a\u0628\u062f\u06cc\u0644\u06cc \u0688\u06cc\u0679\u0627 \u06a9\u06cc\u067e\u0686\u0631 \u06a9\u0646\u06cc\u06a9\u0679\u0631 \u062c\u06cc\u0633\u06d2 \u0688\u06cc\u0628\u06cc\u0632\u06cc\u0645) \u0622\u0624\u0679 \u0628\u0627\u06a9\u0633 \u0679\u06cc\u0628\u0644 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0628\u0631\u0648\u06a9\u0631 \u06a9\u0648 \u067e\u0648\u0633\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Outbox pattern: write event to the database, not the broker\n\/\/ db injected via dependency injection\nasync function confirmOrder(order: Order, db: Database): Promise<void> {\n  await db.transaction(async (tx) => {\n    \/\/ Business write and event write in the same transaction\n    await tx.update(\"orders\", { id: order.id, status: \"confirmed\" });\n    await tx.insert(\"outbox\", {\n      id: crypto.randomUUID(),\n      topic: \"order.confirmed\",\n      key: order.id,\n      payload: JSON.stringify({\n        orderId: order.id,\n        customerId: order.customerId,\n        items: order.items,\n        total: order.total,\n      }),\n      created_at: new Date(),\n    });\n  });\n  \/\/ A separate relay process picks up outbox rows and publishes to Kafka\n}\n<\/void><\/code><\/pre>\n<p>\u0648\u0627\u0642\u0639\u0627\u062a \u0627\u0648\u0631 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0627\u0639\u062f\u0627\u062f \u0648 \u0634\u0645\u0627\u0631 \u062c\u0648\u06c1\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0644\u06a9\u06be\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0628\u0631\u0648\u06a9\u0631 \u06a9\u06cc \u0628\u0646\u062f\u0634 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0628\u06be\u06cc \u0636\u0627\u0626\u0639 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0631\u06cc\u0644\u06d2 \u06a9\u0627 \u0639\u0645\u0644 \u0628\u0631\u0648\u06a9\u0631 \u06a9\u06d2 \u0648\u0627\u067e\u0633 \u0622\u0646\u06d2 \u062a\u06a9 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-2-at-least-once-delivery\">2. \u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc<\/h4>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0628\u0631\u0648\u06a9\u0631\u0632 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u0627\u06cc\u06a9 \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc \u06a9\u06cc \u0636\u0645\u0627\u0646\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0628\u0627\u0631 \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba (\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0648\u0627\u0632\u0646 \u06cc\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06d2 \u0628\u0639\u062f)\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0628\u06d2 \u062d\u0633 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u062f\u0648 \u0628\u0627\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0648\u06c1\u06cc \u0646\u062a\u0627\u0626\u062c \u0628\u0631\u0622\u0645\u062f \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba \u062c\u0648 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Idempotent consumer: use the eventId to deduplicate\nasync function handleOrderConfirmed(event: EventEnvelope<orderdata>): Promise<void> {\n  const alreadyProcessed = await db.query(\n    \"SELECT 1 FROM processed_events WHERE event_id = $1\",\n    [event.eventId]\n  );\n\n  if (alreadyProcessed.rows.length > 0) {\n    logger.info(\"Duplicate event, skipping\", { eventId: event.eventId });\n    return;\n  }\n\n  await db.transaction(async (tx) => {\n    await decrementStock(tx, event.data.items);\n    await tx.insert(\"processed_events\", {\n      event_id: event.eventId,\n      processed_at: new Date(),\n    });\n  });\n}\n<\/void><\/orderdata><\/code><\/pre>\n<p>\u0622\u0624\u0679 \u0628\u0627\u06a9\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0645\u062c\u0645\u0648\u0639\u06c1 (\u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u06a9\u06cc \u0637\u0631\u0641) \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0635\u0627\u0631\u0641 (\u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06cc \u0637\u0631\u0641) \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0645\u0648\u0627\u0635\u0644\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u062c\u0628 \u0628\u0631\u0648\u06a9\u0631 \u06a9\u0648 \u0648\u0642\u0641\u06d2 \u0648\u0642\u0641\u06d2 \u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0648\u06ba \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-the-five-trade-off-dimensions\">\u0633\u0645\u062c\u06be\u0648\u062a\u06c1 \u06a9\u06cc \u067e\u0627\u0646\u0686 \u062c\u06c1\u062a\u06cc\u06ba\u06d4<\/h2>\n<p>\u0645\u0648\u0627\u0635\u0644\u0627\u062a\u06cc \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0633 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u0627 &quot;\u0628\u06c1\u062a\u0631\u06cc\u0646&#8221; \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06c1\u0631 \u0627\u06cc\u06a9 \u062e\u0627\u0635 \u062a\u0639\u0627\u0645\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u062a\u0646\u0627 \u0633\u0645\u062c\u06be\u0648\u062a\u06c1 \u0642\u0628\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06cc\u06ba\u06d4 \u067e\u0627\u0646\u0686 \u0627\u06c1\u0645 \u062a\u0631\u06cc\u0646 \u062c\u06c1\u062a\u06cc\u06ba \u06cc\u06c1 \u06c1\u06cc\u06ba:<\/p>\n<h3 id=\"heading-1-latency\">1. \u062a\u0627\u062e\u06cc\u0631 \u06a9\u0627 \u0648\u0642\u062a<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u067e\u06cc\u0679\u0631\u0646<\/th>\n<th>\u0631\u0634\u062a\u06c1 \u062f\u0627\u0631 \u062a\u0627\u062e\u06cc\u0631<\/th>\n<th>\u06a9\u06cc\u0648\u06ba<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/td>\n<td>\u0633\u0628 \u0633\u06d2 \u06a9\u0645<\/td>\n<td>\u0628\u0627\u0626\u0646\u0631\u06cc \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646\u060c HTTP\/2 \u0645\u0644\u0679\u06cc \u067e\u0644\u06cc\u06a9\u0633\u0646\u06af\u060c \u0645\u0633\u062a\u0642\u0644 \u0631\u0627\u0628\u0637\u06d2<\/td>\n<\/tr>\n<tr>\n<td>\u0628\u0627\u0642\u06cc<\/td>\n<td>\u06a9\u0645 \u062f\u0631\u0645\u06cc\u0627\u0646\u06c1<\/td>\n<td>JSON \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u06a9\u0648 \u067e\u0627\u0631\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 HTTP\/1.1 \u06a9\u0646\u06a9\u0634\u0646 \u0642\u0627\u0626\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/td>\n<td>\u0628\u06c1\u062a\u0631\u06cc\u0646 (\u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2)<\/td>\n<td>\u0628\u0631\u0648\u06a9\u0631 \u0644\u06a9\u06be\u0646\u0627\u060c \u0646\u0642\u0644 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u0646\u0627\u060c \u0627\u0648\u0631 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u067e\u0648\u0644\u0646\u06af \u06a9\u06d2 \u0648\u0642\u0641\u06c1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0635\u062d\u06cc\u062d \u062a\u0639\u062f\u0627\u062f \u067e\u06d2 \u0644\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u0626\u0632\u060c \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u06c1\u0627\u067e\u0633\u060c \u0627\u0648\u0631 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4 \u0633\u0627\u062e\u062a\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06cc\u06a9\u0633\u0627\u06ba \u06c1\u06d2\u06d4 \u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632 \u06a9\u0627\u0644\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c gRPC \u0633\u0628 \u0633\u06d2 \u062a\u06cc\u0632 \u06c1\u06d2\u060c \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f REST\u060c \u0627\u0648\u0631 \u0644\u06cc\u0679\u0646\u0633\u06cc \u06a9\u0648 \u0688\u06cc\u06a9\u067e\u0644\u0646\u06af \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0645\u06cc\u0633\u062c\u0646\u06af \u0679\u0631\u06cc\u0688\u0632\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0628\u06be\u06cc\u062c\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u062c\u0648\u0627\u0628 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 (\u0635\u0627\u0631\u0641 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc\u060c \u0627\u0635\u0644 \u0648\u0642\u062a \u06a9\u06cc \u062a\u0644\u0627\u0634)\u060c gRPC \u06cc\u0627 REST \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u0633\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u062c\u0628 \u0628\u06be\u06cc\u062c\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0648 \u0627\u0628\u06be\u06cc \u0646\u062a\u0627\u0626\u062c \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1 \u06c1\u0648 (\u0627\u06cc \u0645\u06cc\u0644 \u0628\u06be\u06cc\u062c\u0646\u0627\u060c \u062a\u062c\u0632\u06cc\u0627\u062a \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u0627)\u06d4<\/p>\n<h3 id=\"heading-2-coupling\">2. \u062c\u0648\u0691\u0627<\/h3>\n<p>\u062c\u0648\u0691\u06d2 \u06a9\u06cc \u062f\u0648 \u062c\u06c1\u062a\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 <strong>\u0639\u0627\u0631\u0636\u06cc<\/strong> (\u06a9\u06cc\u0627 \u0628\u06be\u06cc\u062c\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0648\u0635\u0648\u0644 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u061f) \u0627\u0648\u0631 <strong>\u062e\u0627\u06a9\u06c1<\/strong> (\u06a9\u06cc\u0627 \u0648\u06c1 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u0628\u0627\u0646\u0679\u062a\u06d2 \u06c1\u06cc\u06ba\u061f)<\/p>\n<table>\n<thead>\n<tr>\n<th>\u067e\u06cc\u0679\u0631\u0646<\/th>\n<th>\u0639\u0627\u0631\u0636\u06cc \u0645\u062c\u0645\u0648\u0639\u06c1<\/th>\n<th>\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0627 \u0627\u0645\u062a\u0632\u0627\u062c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0628\u0627\u0642\u06cc<\/td>\n<td>\u06c1\u0627\u0626\u06cc (\u06a9\u0627\u0644\u0631 \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627)<\/td>\n<td>\u06a9\u0645 (JSON \u0644\u0686\u06a9\u062f\u0627\u0631 \u06c1\u06d2)<\/td>\n<\/tr>\n<tr>\n<td>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/td>\n<td>\u06c1\u0627\u0626\u06cc (\u06a9\u0627\u0644\u0631 \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627)<\/td>\n<td>\u0627\u0639\u0644\u06cc (\u0645\u0634\u062a\u0631\u06a9\u06c1 <code>.proto<\/code> \u0641\u0627\u0626\u0644)<\/td>\n<\/tr>\n<tr>\n<td>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/td>\n<td>\u06a9\u0648\u0626\u06cc \u0646\u06c1\u06cc\u06ba (\u0622\u06af \u0627\u0648\u0631 \u0628\u06be\u0648\u0644 \u062c\u0627\u0624)<\/td>\n<td>\u0645\u06cc\u0688\u06cc\u0645 (\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u06cc\u0648\u0646\u0679 \u0633\u06a9\u06cc\u0645\u0627)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>REST \u06a9\u06cc \u0688\u06be\u06cc\u0644\u06cc \u0679\u0627\u0626\u067e\u0646\u06af \u0627\u06cc\u06a9 \u062f\u0648 \u062f\u06be\u0627\u0631\u06cc \u062a\u0644\u0648\u0627\u0631 \u06c1\u06d2\u06d4 \u0622\u067e \u0635\u0627\u0631\u0641 \u06a9\u0648 \u062a\u0648\u0691\u06d2 \u0628\u063a\u06cc\u0631 JSON \u062c\u0648\u0627\u0628 \u0645\u06cc\u06ba \u0641\u06cc\u0644\u0688\u0632 \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba (\u0645\u0632\u06cc\u062f \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0645\u062d\u0641\u0648\u0638 \u06c1\u06cc\u06ba)\u06d4 \u062a\u0627\u06c1\u0645\u060c \u063a\u0644\u0637\u06cc \u0633\u06d2 \u06a9\u0633\u06cc \u0641\u06cc\u0644\u0688 \u06a9\u0648 \u06c1\u0679\u0627\u0646\u06d2 \u0633\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0645\u067e\u0627\u0626\u0644 \u0679\u0627\u0626\u0645 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>gRPC \u06a9\u06cc \u0633\u062e\u062a \u0679\u0627\u0626\u067e\u0646\u06af \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba \u0628\u0631\u06cc\u06a9\u0646\u06af \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u067e\u06a9\u0691\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0627\u0633\u06a9\u06cc\u0645\u0627 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062f\u0648 \u062e\u062f\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u0645\u0639\u0645\u0648\u0644\u06cc \u0628\u0627\u062a \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u06c1\u06cc \u067e\u0631\u0648\u0679\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc 20 \u062e\u062f\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u06cc\u06a9 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u0639\u0645\u0644 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0631\u0633\u0627\u0646\u06cc \u06a9\u0648 \u0648\u0642\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0644\u06af \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u067e\u06be\u0631 \u0628\u06be\u06cc \u0627\u06cc\u0648\u0646\u0679 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0628\u0646\u062f\u06be\u0627 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 <code>order.confirmed<\/code> \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0648\u0627\u0642\u0639\u06c1 \u0688\u06be\u0627\u0646\u0686\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u067e\u0631\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0641\u0627\u0631\u0645\u06cc\u0679\u0633 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h3 id=\"heading-3-schema-evolution\">3. \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0631\u062a\u0642\u0627\u0621<\/h3>\n<p>\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0631\u062a\u0642\u0627\u0621 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0645\u06cc\u06ba \u062e\u0644\u0644 \u0688\u0627\u0644\u06d2 \u0628\u063a\u06cc\u0631 \u062e\u062f\u0645\u0627\u062a \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0645\u0639\u0627\u06c1\u062f\u0648\u06ba \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u062a\u06cc\u0646 \u067e\u06cc\u0679\u0631\u0646 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-rest-json\">REST (JSON):<\/h4>\n<pre><code class=\"language-typescript\">\/\/ Version 1: price as a number\n{ \"productId\": \"abc-123\", \"price\": 49.99 }\n\n\/\/ Version 2: price as an object (breaking change)\n{ \"productId\": \"abc-123\", \"price\": { \"amount\": 49.99, \"currency\": \"USD\" } }\n<\/code><\/pre>\n<p>JSON \u0645\u06cc\u06ba \u0628\u0644\u0679 \u0627\u0646 \u0648\u0631\u0698\u0646\u0646\u06af \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062a\u06cc\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u06cc\u06ba:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc<\/th>\n<th>\u06cc\u06c1 \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/th>\n<th>\u0633\u0645\u062c\u06be\u0648\u062a\u06c1 \u06a9\u06cc \u0645\u0646\u0635\u0648\u0628\u06c1 \u0628\u0646\u062f\u06cc<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u0648\u0631\u0698\u0646\u0646\u06af<\/strong> (<code>\/api\/v1\/<\/code> \u0628\u0691\u0627 <code>\/api\/v2\/<\/code>)<\/td>\n<td>\u06c1\u0631 \u0648\u0631\u0698\u0646 \u0627\u06cc\u06a9 \u0627\u0644\u06af \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0646\u0626\u06d2 \u0648\u0631\u0698\u0646 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/td>\n<td>\u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u0627 \u0633\u0628 \u0633\u06d2 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u0631\u0648\u0679 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u06cc \u0646\u0642\u0644 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0628\u06c1\u062a \u0633\u06d2 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0644\u0627\u06a9 \u0627\u0646 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u067e\u0631\u0627\u0646\u06d2 \u0648\u0631\u0698\u0646 \u06a9\u0648 \u0686\u06be\u0648\u0691\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>\/v1\/<\/code>.<\/td>\n<\/tr>\n<tr>\n<td><strong>\u06c1\u06cc\u0688\u0631 \u0648\u0631\u0698\u0646\u0646\u06af<\/strong> (<code>Accept: application\/vnd.myapi.v2+json<\/code>)<\/td>\n<td>\u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f URL\u060c \u0648\u0631\u0698\u0646 \u06c1\u06cc\u0688\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06af\u0641\u062a \u0648 \u0634\u0646\u06cc\u062f\u06d4<\/td>\n<td>\u06a9\u0644\u06cc\u0646\u0631 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644\u060c \u06a9\u0648\u0626\u06cc \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u0631\u0627\u0633\u062a\u06d2 \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u06d2 (\u0622\u067e \u0635\u0631\u0641 URL \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u067e\u06cc\u0633\u0679 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba)\u06d4 \u067e\u0631\u0627\u06a9\u0633\u06cc \u0627\u0648\u0631 \u06a9\u06cc\u0634\u06d2 \u06a9\u0627 \u0631\u0648\u06cc\u06c1 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u062c\u0648\u0627\u0628 \u06c1\u06cc\u0688\u0631 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td><strong>\u062f\u0641\u0627\u0639\u06cc \u062a\u062c\u0632\u06cc\u06c1<\/strong> (\u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06cc \u0637\u0631\u0641 \u0631\u0648\u0627\u062f\u0627\u0631\u06cc)<\/td>\n<td>\u06a9\u0648\u0626\u06cc \u0648\u0627\u0636\u062d \u0648\u0631\u0698\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0646\u0627\u0645\u0639\u0644\u0648\u0645 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06af\u0645 \u0634\u062f\u06c1 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0648\u06cc\u0644\u06cc\u0648\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/td>\n<td>\u0627\u0636\u0627\u0641\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0627\u06cc\u0688\u062c\u0633\u0679\u0645\u0646\u0679 \u0641\u06cc\u0633 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0646 \u06a9\u06cc \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u0633\u0627\u062e\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba (\u0641\u06cc\u0644\u0688 \u06a9\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba\u060c \u0642\u0633\u0645 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba) \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u0646 \u06a9\u06d2 \u0627\u0631\u0627\u062f\u06d2 \u06a9\u0627 \u0635\u0627\u0631\u0641 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06af\u0627 \u0633\u06a9\u062a\u0627\u06d4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u06a9\u0633\u06cc \u0628\u06be\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba (\u0646\u0626\u06cc \u0641\u06cc\u0644\u0688\u0632) \u0645\u062d\u0641\u0648\u0638 \u06c1\u06cc\u06ba\u06d4 \u0633\u0627\u062e\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba (\u0641\u06cc\u0644\u0688 \u06a9\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba\u060c \u0642\u0633\u0645 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba) \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0627\u067e\u0646\u06cc \u0631\u0641\u062a\u0627\u0631 \u0633\u06d2 \u06c1\u062c\u0631\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u0627\u0636\u062d \u0648\u0631\u0698\u0646\u0646\u06af (URL \u06cc\u0627 \u06c1\u06cc\u0688\u0631) \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-grpc-protocol-buffers\">gRPC (\u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0628\u0641\u0631):<\/h4>\n<pre><code class=\"language-protobuf\">\/\/ Protocol Buffers have built-in evolution rules\nmessage StockResponse {\n  string product_id = 1;\n  int32 available = 2;\n  int32 reserved = 3;\n  \/\/ Field 4 was removed (never reuse field numbers)\n  string warehouse_id = 5;       \/\/ New field: old clients ignore it\n  optional string region = 6;    \/\/ Optional: old clients don't send it\n}\n<\/code><\/pre>\n<p>\u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0628\u0641\u0631\u0632 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0627\u0631\u062a\u0642\u0627\u0621 \u06a9\u0648 \u0627\u0686\u06be\u06cc \u0637\u0631\u062d \u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0646\u0626\u06d2 \u0641\u06cc\u0644\u0688\u0632 \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba (\u0645\u0648\u062c\u0648\u062f\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679\u0633 \u0627\u0646 \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631 \u062f\u06cc\u06ba \u06af\u06d2) \u0627\u0648\u0631 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u0648 \u0641\u0631\u0633\u0648\u062f\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba (\u0644\u06a9\u06be\u0646\u0627 \u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0646\u0645\u0628\u0631 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u06cc\u06ba)\u06d4 <code>optional<\/code> \u0627\u0646 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0648 \u0634\u0627\u06cc\u062f \u0645\u0648\u062c\u0648\u062f \u0646\u06c1 \u06c1\u0648\u06ba\u06d4<\/p>\n<p>\u0622\u067e \u0641\u06cc\u0644\u0688 \u06a9\u0627 \u0646\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u060c \u0641\u06cc\u0644\u0688 \u06a9\u06cc \u0642\u0633\u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u060c \u06cc\u0627 \u0641\u06cc\u0644\u0688 \u0646\u0645\u0628\u0631\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u06d4 \u06cc\u06c1 \u0627\u0635\u0648\u0644 \u0679\u0648\u0644 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0646\u0627\u0641\u0630 \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-event-driven-avrojson-schema\">\u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc (Avro\/JSON \u0633\u06a9\u06cc\u0645\u0627):<\/h4>\n<p>\u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u06cc\u06a9 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc \u062c\u06cc\u0633\u0627 \u06a9\u06c1 Confluent Schema Registry \u0645\u0637\u0627\u0628\u0642\u062a \u06a9\u06d2 \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Register a schema with backward compatibility\n\/\/ New consumers can read old events, old consumers can read new events\nconst schema = {\n  type: \"record\",\n  name: \"OrderConfirmed\",\n  fields: [\n    { name: \"orderId\", type: \"string\" },\n    { name: \"customerId\", type: \"string\" },\n    { name: \"total\", type: \"double\" },\n    \/\/ New field with default: backward compatible\n    { name: \"currency\", type: \"string\", default: \"USD\" },\n  ],\n};\n<\/code><\/pre>\n<p>\u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631\u0632 \u06a9\u0648 \u0627\u06cc\u0633\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u0634\u0627\u0626\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u0645\u0637\u0627\u0628\u0642\u062a \u06a9\u06d2 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06cc \u062e\u0644\u0627\u0641 \u0648\u0631\u0632\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u062d\u06a9\u0645\u0631\u0627\u0646\u06cc \u06a9\u0627 \u0633\u0628 \u0633\u06d2 \u0637\u0627\u0642\u062a\u0648\u0631 \u0645\u0627\u0688\u0644 \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0631\u062c\u0633\u0679\u0631\u06cc \u063a\u06cc\u0631 \u0645\u0648\u0627\u0641\u0642 \u0627\u0633\u06a9\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-4-debugging-and-observability\">4. \u0688\u06cc\u0628\u06af\u0646\u06af \u0627\u0648\u0631 \u0622\u0628\u0632\u0631\u0648\u06cc\u0628\u0644\u0679\u06cc<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u067e\u06cc\u0679\u0631\u0646<\/th>\n<th>\u0688\u06cc\u0628\u06af\u0646\u06af \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0628\u0627\u0642\u06cc<\/td>\n<td>\u0628\u06c1\u062a\u0631\u06cc\u0646 \u0627\u0646\u0633\u0627\u0646\u06cc \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u067e\u06d2 \u0644\u0648\u0688\u060c \u0628\u0631\u0627\u0624\u0632\u0631 DevTools\u060c <code>curl<\/code>\u0645\u0639\u06cc\u0627\u0631\u06cc HTTP \u0679\u0631\u06cc\u06a9\u0646\u06af\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/td>\n<td>\u0646\u0627\u0631\u0645\u0644 \u0628\u0627\u0626\u0646\u0631\u06cc \u067e\u06d2 \u0644\u0648\u0688 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 <code>grpcurl<\/code> \u06cc\u0627 \u0688\u0627\u06a9\u06cc\u0627\u06d4 \u0622\u067e \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627 \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u06c1 \u0679\u0631\u06cc\u0633\u0646\u06af \u0627\u0686\u06be\u06cc \u0637\u0631\u062d \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/td>\n<td>\u0633\u0628 \u0633\u06d2 \u0645\u0634\u06a9\u0644\u06d4 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0628\u06c1\u0627\u0624 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0631\u062a\u0628\u0627\u0637\u06cc IDs\u060c \u0688\u06cc\u0688 \u0644\u06cc\u0679\u0631 \u0642\u0637\u0627\u0631 \u0686\u06cc\u06a9\u060c \u0627\u0648\u0631 \u0628\u0631\u0648\u06a9\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0679\u0648\u0644\u0632 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0646\u0638\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u0631\u062a\u0628\u0627\u0637\u06cc IDs \u0636\u0631\u0648\u0631\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Always include a correlation ID in events\ninterface EventEnvelope<t> {\n  eventId: string;\n  eventType: string;\n  correlationId: string; \/\/ Links related events across services\n  causationId: string;   \/\/ The event that caused this one\n  timestamp: string;\n  source: string;\n  data: T;\n}\n\nasync function publishEvent<t extends=\"\" entityid:=\"\" string=\"\">(\n  topic: string,\n  type: string,\n  data: T,\n  correlationId: string,\n  causationId?: string\n): Promise<void> {\n  const event: EventEnvelope<t> = {\n    eventId: crypto.randomUUID(),\n    eventType: type,\n    correlationId,\n    causationId: causationId ?? correlationId,\n    timestamp: new Date().toISOString(),\n    source: SERVICE_NAME,\n    data,\n  };\n\n  await producer.send({\n    topic,\n    messages: [{ key: data.entityId, value: JSON.stringify(event) }],\n  });\n}\n<\/t><\/void><\/t><\/t><\/code><\/pre>\n<p>\u06a9\u0633\u06cc \u0645\u0633\u0626\u0644\u06d2 \u06a9\u06cc \u0686\u06be\u0627\u0646 \u0628\u06cc\u0646 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a\u060c \u06c1\u0645 \u062a\u0645\u0627\u0645 \u0633\u0631\u0648\u0633\u0632 \u0645\u06cc\u06ba \u0627\u0631\u062a\u0628\u0627\u0637\u06cc IDs \u06a9\u0648 \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u06d2 \u067e\u0648\u0631\u06d2 \u0633\u0644\u0633\u0644\u06d2 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0634\u06a9\u06cc\u0644 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u06cc\u06c1 \u06af\u06be\u0627\u0633 \u06a9\u06d2 \u0688\u06be\u06cc\u0631 \u0645\u06cc\u06ba \u0633\u0648\u0626\u06cc \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0645\u062a\u0631\u0627\u062f\u0641 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-5-operational-complexity\">5. \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u067e\u06cc\u0679\u0631\u0646<\/th>\n<th>\u0622\u067e \u06a9\u06cc\u0627 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0628\u0627\u0642\u06cc<\/td>\n<td>HTTP \u0633\u0631\u0648\u0631\u060c \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631\u060c API \u06af\u06cc\u0679 \u0648\u06d2<\/td>\n<\/tr>\n<tr>\n<td>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/td>\n<td>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc \u0633\u0631\u0648\u0631\u060c \u067e\u0631\u0648\u0679\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc\u060c \u06a9\u0648\u0688 \u062c\u0646\u0631\u06cc\u0634\u0646 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u060c \u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc \u0648\u06cc\u0628 \u067e\u0631\u0627\u06a9\u0633\u06cc (\u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06c1\u06d2)<\/td>\n<\/tr>\n<tr>\n<td>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/td>\n<td>\u0645\u06cc\u0633\u062c \u0628\u0631\u0648\u06a9\u0631 (\u06a9\u0627\u0641\u06a9\u0627\/ \u0631\u0628\u06cc\u0679 \u0627\u06cc\u0645 \u06a9\u06cc\u0648\/ \u0627\u06cc\u0633 \u06a9\u06cc\u0648 \u0627\u06cc\u0633)\u060c \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc\u060c \u0688\u06cc\u0688 \u0644\u06cc\u0679\u0631 \u0642\u0637\u0627\u0631\u060c \u0635\u0627\u0631\u0641\u06cc\u0646 \u0645\u06cc\u06ba \u062a\u0627\u062e\u06cc\u0631 \u06a9\u06cc \u0646\u06af\u0631\u0627\u0646\u06cc<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>REST \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u06a9\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0679\u06cc\u0645 \u062c\u0627\u0646\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 HTTP \u0633\u0631\u0648\u0631 \u06a9\u06cc\u0633\u06d2 \u0686\u0644\u0627\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>gRPC \u0628\u0644\u0688 \u0679\u0627\u0626\u0645 \u0627\u0646\u062d\u0635\u0627\u0631 (\u067e\u0631\u0648\u0679\u0648 \u06a9\u0645\u067e\u0644\u06cc\u0634\u0646) \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u0646\u0626\u06d2 \u0679\u0648\u0644\u0632 \u0633\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u0648\u0646\u0679 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0627\u0646\u062d\u0635\u0627\u0631 (\u0628\u0631\u0648\u06a9\u0631) \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u06af\u0631 \u0628\u0631\u0648\u06a9\u0631 \u0646\u06cc\u0686\u06d2 \u0686\u0644\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u062e\u062f\u0645\u0627\u062a \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0645\u0648\u0627\u0635\u0644\u062a \u0631\u06a9 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-the-decision-framework\">\u0641\u06cc\u0635\u0644\u06c1 \u0633\u0627\u0632\u06cc \u06a9\u0627 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9<\/h2>\n<p>\u0627\u0633 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u062c\u0628 \u06cc\u06c1 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u062e\u062f\u0645\u0627\u062a \u06a9\u0627 \u0627\u06cc\u06a9 \u062e\u0627\u0635 \u062c\u0648\u0691\u0627 \u06a9\u0633 \u0637\u0631\u062d \u0628\u0627\u062a \u0686\u06cc\u062a \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u062c\u0648\u0627\u0628 \u067e\u0648\u0631\u06d2 \u0646\u0638\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0634\u0627\u0630 \u0648 \u0646\u0627\u062f\u0631 \u06c1\u06cc \u0627\u06cc\u06a9 \u0646\u0645\u0648\u0646\u06c1 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">Does the caller need an immediate response?\n\u251c\u2500\u2500 Yes \u2192 Is this a public-facing or browser-accessible API?\n\u2502         \u251c\u2500\u2500 Yes \u2192 REST\n\u2502         \u2514\u2500\u2500 No  \u2192 Is throughput or latency critical?\n\u2502                   \u251c\u2500\u2500 Yes \u2192 gRPC\n\u2502                   \u2514\u2500\u2500 No  \u2192 REST (simpler, good enough)\n\u2514\u2500\u2500 No  \u2192 Can the caller tolerate eventual consistency?\n          \u251c\u2500\u2500 No  \u2192 Use synchronous call (REST or gRPC) with async follow-up\n          \u2514\u2500\u2500 Yes \u2192 Does the event need to trigger multiple consumers?\n                    \u251c\u2500\u2500 Yes \u2192 Event-driven messaging\n                    \u2514\u2500\u2500 No  \u2192 Is ordering critical?\n                              \u251c\u2500\u2500 Yes \u2192 Event-driven with partition key\n                              \u2514\u2500\u2500 No  \u2192 Event-driven (or simple queue like SQS)\n<\/code><\/pre>\n<p>\u06a9\u0686\u06be \u0645\u062e\u0635\u0648\u0635 \u0645\u062b\u0627\u0644\u06cc\u06ba:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u062a\u0639\u0627\u0645\u0644<\/th>\n<th>\u067e\u06cc\u0679\u0631\u0646<\/th>\n<th>\u06a9\u06cc\u0648\u06ba<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u0635\u0646\u0648\u0639\u0627\u062a \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u0628\u0627\u0642\u06cc<\/td>\n<td>\u0628\u0631\u0627\u0624\u0632\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0637\u0648\u0631 \u067e\u0631 gRPC \u06a9\u0648 \u06a9\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 REST \u06a9\u06cc\u0634\u0646\u06af \u06a9\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a\u06cc\u06ba \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0686\u06cc\u06a9 \u0622\u0624\u0679 \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0645\u06cc\u06ba \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc\u0648\u06ba \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/td>\n<td>\u06a9\u0645 \u062a\u0627\u062e\u06cc\u0631\u060c \u0645\u0636\u0628\u0648\u0637 \u0679\u0627\u0626\u067e\u0646\u06af\u060c \u0635\u0631\u0641 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 (\u0631\u0648\u0679 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0628\u0631\u0627\u0624\u0632\u0631 \u0646\u06c1\u06cc\u06ba)<\/td>\n<\/tr>\n<tr>\n<td>\u0622\u067e \u06a9\u06d2 \u0622\u0631\u0688\u0631 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u062a\u06a9\u0645\u06cc\u0644 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/td>\n<td>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/td>\n<td>\u0645\u062a\u0639\u062f\u062f \u0635\u0627\u0631\u0641\u06cc\u0646\u060c \u0648\u0642\u062a\u06cc \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc<\/td>\n<\/tr>\n<tr>\n<td>\u0641\u0631\u0646\u0679 \u0627\u06cc\u0646\u0688 \u06a9\u0648 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u0645\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u0628\u0627\u0642\u06cc<\/td>\n<td>\u0633\u0627\u062f\u06c1 CRUD\u060c \u06a9\u06cc\u0634 \u0627\u06cc\u0628\u0644\u060c \u0628\u0631\u0627\u0624\u0632\u0631 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/td>\n<\/tr>\n<tr>\n<td>\u0627\u06cc\u0645 \u0627\u06cc\u0644 \u0633\u0631\u0648\u0633 \u0633\u06a9\u0648\u0631 \u06a9\u06cc \u0633\u0641\u0627\u0631\u0634\u0627\u062a<\/td>\n<td>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/td>\n<td>\u06c1\u0627\u0626\u06cc \u062a\u06be\u0631\u0648 \u067e\u0679\u060c \u0628\u0627\u0626\u0646\u0631\u06cc \u067e\u06d2 \u0644\u0648\u0688\u060c \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af<\/td>\n<\/tr>\n<tr>\n<td>\u06cc\u0648\u0632\u0631 \u0633\u0627\u0626\u0646 \u0627\u067e \u0627\u06cc\u06a9 \u062e\u0648\u0634 \u0622\u0626\u0646\u062f \u0627\u06cc \u0645\u06cc\u0644 \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/td>\n<td>\u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u060c \u0641\u0648\u0631\u06cc \u062c\u0648\u0627\u0628 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0633\u0631\u0648\u0633 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<td>\u0628\u0627\u0642\u06cc<\/td>\n<td>\u0633\u0627\u062f\u06af\u06cc\u060c \u0639\u0627\u0644\u0645\u06af\u06cc\u0631 \u0679\u0648\u0644\u0646\u06af<\/td>\n<\/tr>\n<tr>\n<td>\u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u06a9\u06cc \u0633\u0637\u062d \u06a9\u06cc \u0646\u06af\u0631\u0627\u0646\u06cc<\/td>\n<td>gRPC \u0633\u0679\u0631\u06cc\u0645\u0646\u06af<\/td>\n<td>\u0645\u0633\u0644\u0633\u0644 \u0627\u067e \u0688\u06cc\u0679\u0633\u060c \u0636\u0631\u0648\u0631\u062a \u067e\u0691\u0646\u06d2 \u067e\u0631 \u062f\u0648 \u0637\u0631\u0641\u06c1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"heading-hybrid-architectures-using-all-three\">\u06c1\u0627\u0626\u0628\u0631\u0688 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631: \u062a\u06cc\u0646\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0646\u0638\u0627\u0645 \u0627\u0645\u062a\u0632\u0627\u062c \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2 \u062c\u0648 \u0627\u0686\u06be\u06cc \u0637\u0631\u062d \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    REST     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    gRPC    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Browser  \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#x25b6;\u2502  API Gateway \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#x25b6;\u2502 Order Service\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518             \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                                           \u2502\n                                                    publishes event\n                                                           \u2502\n                                                           \u25bc\n                                                    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                                                    \u2502    Kafka     \u2502\n                                                    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                                          \u25bc                \u25bc                \u25bc\n                                   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                                   \u2502 Inventory  \u2502  \u2502 Notification\u2502  \u2502 Analytics  \u2502\n                                   \u2502  Service   \u2502  \u2502  Service    \u2502  \u2502  Service   \u2502\n                                   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<ul>\n<li>\n<p><strong>\u0628\u0627\u0642\u06cc<\/strong> \u06a9\u0646\u0627\u0631\u06d2 \u067e\u0631: \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u0639\u06cc\u0627\u0631\u06cc HTTP \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 API \u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0627\u062a \u0686\u06cc\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06a9\u06cc\u0634 \u0627\u06cc\u0628\u0644\u060c \u0688\u06cc\u0628\u06af \u0627\u06cc\u0628\u0644 \u0627\u0648\u0631 \u0639\u0627\u0644\u0645\u06cc \u0633\u0637\u062d \u067e\u0631 \u062a\u0639\u0627\u0648\u0646 \u06cc\u0627\u0641\u062a\u06c1 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/strong> \u06af\u06cc\u0679 \u0648\u06cc\u0632 \u0627\u0648\u0631 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u062e\u062f\u0645\u0627\u062a \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646: \u06a9\u0645 \u062a\u0627\u062e\u06cc\u0631\u060c \u0645\u0636\u0628\u0648\u0637 \u0679\u0627\u0626\u067e\u0646\u06af\u060c \u0645\u0648\u062b\u0631 \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc<\/strong> \u0688\u0627\u0624\u0646 \u0627\u0633\u0679\u0631\u06cc\u0645 \u0631\u06cc \u0627\u06cc\u06a9\u0634\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2: \u0627\u06cc\u06a9 \u0622\u0631\u0688\u0631\u0646\u06af \u0633\u0631\u0648\u0633 \u0627\u06cc\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0648\u0633\u0679 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u062a\u0639\u062f\u062f \u0635\u0627\u0631\u0641\u06cc\u0646 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<h3 id=\"heading-the-anti-synchronous-trap\">\u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0679\u0631\u06cc\u067e<\/h3>\n<p>\u0627\u06cc\u06a9 \u0639\u0627\u0645 \u063a\u0644\u0637\u06cc \u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632 \u06a9\u0627\u0644\u0632 (REST \u06cc\u0627 gRPC) \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0627\u06cc\u0648\u0646\u0679\u0633 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0648\u0632\u0648\u06ba \u06c1\u0648\u06ba\u06d4 \u0639\u0644\u0627\u0645\u062a: \u0627\u06cc\u06a9 \u0633\u0631\u0648\u0633 \u0627\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u067e\u0627\u0646\u0686 \u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632 \u06a9\u0627\u0644\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0644\u0631 \u06a9\u0648 \u062c\u0648\u0627\u0628 \u062f\u06cc\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0631 \u06a9\u0627\u0644 \u06a9\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Anti-pattern: synchronous fan-out\nasync function confirmOrder(order: Order): Promise<void> {\n  await inventoryService.decrementStock(order.items);    \/\/ 50ms\n  await paymentService.capturePayment(order.paymentId);  \/\/ 200ms\n  await notificationService.sendConfirmation(order);     \/\/ 100ms\n  await analyticsService.recordConversion(order);        \/\/ 80ms\n  await shippingService.createShipment(order);           \/\/ 150ms\n  \/\/ Total: 580ms, and if any one fails, the order fails\n}\n<\/void><\/code><\/pre>\n<p>\u0627\u067e\u0646\u06d2 \u0622\u0631\u0688\u0631 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0635\u0631\u0641 \u067e\u06c1\u0644\u06cc \u062f\u0648 \u06a9\u0627\u0644\u06cc\u06ba (\u0627\u0633\u0679\u0627\u06a9 \u0627\u0648\u0631 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc) \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 \u0628\u0627\u0642\u06cc \u0627\u06cc\u0633\u06d2 \u0631\u062f\u0639\u0645\u0644 \u06c1\u06cc\u06ba \u062c\u0648 \u0645\u062a\u0636\u0627\u062f \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Better: synchronous for critical path, events for reactions\nasync function confirmOrder(order: Order): Promise<void> {\n  \/\/ Critical path: must succeed for the order to be valid\n  await inventoryService.decrementStock(order.items);\n  await paymentService.capturePayment(order.paymentId);\n\n  \/\/ Non-critical: publish event, let consumers handle the rest\n  await publishOrderConfirmed(order);\n  \/\/ Total: 250ms, and notification\/analytics\/shipping failures\n  \/\/ don't block the checkout\n}\n<\/void><\/code><\/pre>\n<p>\u06cc\u06c1 \u0648\u06c1\u06cc \u067e\u0631\u062a\u0648\u06ba \u0648\u0627\u0644\u0627 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u06c1\u06d2 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0644\u0686\u06a9\u062f\u0627\u0631 API \u0688\u06cc\u0632\u0627\u0626\u0646 \u0645\u0636\u0645\u0648\u0646\u06d4 \u0627\u06c1\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632 \u06c1\u06cc\u06ba\u06d4 \u063a\u06cc\u0631 \u062a\u0646\u0642\u06cc\u062f\u06cc \u0631\u062f\u0639\u0645\u0644 \u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc \u06c1\u06cc\u06ba\u06d4 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0646\u06cc\u0686\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06cc \u063a\u0644\u0637\u06cc\u0627\u06ba \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0645\u06a9\u0627\u0646 \u06a9\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-schema-governance-at-scale\">\u0627\u0633\u06a9\u06cc\u0645\u0627 \u06af\u0648\u0631\u0646\u0646\u0633 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631<\/h2>\n<p>\u062c\u06cc\u0633\u06d2 \u062c\u06cc\u0633\u06d2 \u062e\u062f\u0645\u0627\u062a \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062a\u0634\u0648\u06cc\u0634 \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0630\u06cc\u0644 \u0645\u06cc\u06ba \u06c1\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0639\u0645\u0644\u06cc \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-rest-openapi-as-the-contract\">REST: OpenAPI \u0628\u0637\u0648\u0631 \u0645\u0639\u0627\u06c1\u062f\u06c1<\/h3>\n<pre><code class=\"language-yaml\"># openapi\/inventory-service.yaml\nopenapi: \"3.1.0\"\ninfo:\n  title: Inventory Service\n  version: \"1.2.0\"\npaths:\n  \/api\/v1\/products\/{productId}\/stock:\n    get:\n      operationId: getStock\n      parameters:\n        - name: productId\n          in: path\n          required: true\n          schema:\n            type: string\n      responses:\n        \"200\":\n          description: Stock level for the product\n          content:\n            application\/json:\n              schema:\n                $ref: \"#\/components\/schemas\/StockResponse\"\ncomponents:\n  schemas:\n    StockResponse:\n      type: object\n      required: [productId, available, reserved]\n      properties:\n        productId:\n          type: string\n        available:\n          type: integer\n        reserved:\n          type: integer\n<\/code><\/pre>\n<p>\u062f\u0631\u062c \u0630\u06cc\u0644 \u0679\u0648\u0644\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 OpenAPI \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0633\u06d2 \u06a9\u0644\u0627\u0626\u0646\u0679 SDK \u0628\u0646\u0627\u0626\u06cc\u06ba: <code>openapi-typescript<\/code> \u06cc\u0627 <code>openapi-generator<\/code>. \u06cc\u06c1 gRPC \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0648\u0642\u062a \u06a9\u06d2 \u062c\u0648\u0691\u06d2 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0642\u0633\u0645 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-grpc-proto-registry\">\u062c\u06cc \u0622\u0631 \u067e\u06cc \u0633\u06cc: \u067e\u0631\u0648\u0679\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc<\/h3>\n<p>\u0627\u0633\u0679\u0648\u0631 <code>.proto<\/code> \u0641\u0627\u0626\u0644 \u06a9\u0648 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0630\u062e\u06cc\u0631\u06d2 \u06cc\u0627 \u0627\u06cc\u06a9 \u0648\u0642\u0641 \u0634\u062f\u06c1 \u067e\u0631\u0648\u0679\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u06cc\u06ba (\u0628\u0641 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc \u0627\u06cc\u06a9 \u0627\u0686\u06be\u0627 \u0622\u067e\u0634\u0646 \u06c1\u06d2)\u06d4 \u0645\u06cc\u06ba \u0627\u067e\u0646\u06d2 CI \u0645\u06cc\u06ba \u0628\u0641 \u06a9\u06cc \u0628\u0631\u06cc\u06a9\u0646\u06af \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\"># Detects breaking changes before they merge\nbuf breaking --against \".git#branch=main\"\n<\/code><\/pre>\n<p>\u0627\u0633 \u062d\u06a9\u0645 \u0645\u06cc\u06ba <code>buf.yaml<\/code> \u067e\u0631\u0648\u0679\u0648 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u06a9\u06d2 \u0631\u0648\u0679 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0641\u0627\u0626\u0644\u06d4 \u0641\u0627\u0626\u0644 \u0645\u0627\u0688\u06cc\u0648\u0644 \u06a9\u06d2 \u0646\u0627\u0645 \u0627\u0648\u0631 \u06a9\u0633\u06cc \u0627\u06cc\u0633\u06d2 \u0627\u0635\u0648\u0644 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u0644\u0646\u0679 \u06a9\u06cc \u062e\u0644\u0627\u0641 \u0648\u0631\u0632\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06cc\u0627 \u0642\u0648\u0627\u0639\u062f \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0628\u0641 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u0633\u06d2 \u0631\u062c\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0641\u06cc\u0644\u0688 \u06a9\u0627 \u0646\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0642\u0633\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06cc\u0627 \u0641\u06cc\u0644\u0688 \u0646\u0645\u0628\u0631\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u06cc \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 \u0628\u0691\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba (\u0634\u0627\u0645\u0644 \u06a9\u0631\u062f\u06c1 \u0641\u06cc\u0644\u0688\u0632\u060c \u0627\u0636\u0627\u0641\u06cc \u062e\u062f\u0645\u0627\u062a) \u0645\u0646\u0638\u0648\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-events-schema-registry-with-compatibility-modes\">\u0648\u0627\u0642\u0639\u06c1: \u0645\u0637\u0627\u0628\u0642\u062a \u0645\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc<\/h3>\n<p>\u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0633\u0633\u0679\u0645\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc \u0627\u0634\u0627\u0639\u062a \u06a9\u06d2 \u0648\u0642\u062a \u0645\u0637\u0627\u0628\u0642\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0633\u0646\u06af\u0645 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc \u0686\u0627\u0631 \u0637\u0631\u06cc\u0642\u0648\u06ba \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0637\u0631\u06cc\u0642\u06c1<\/th>\n<th>\u062d\u06a9\u0645\u0631\u0627\u0646\u06cc<\/th>\n<th>\u06a9\u06cc\u0633\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u0648\u0627\u067e\u0633<\/strong><\/td>\n<td>\u0646\u06cc\u0627 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u067e\u0631\u0627\u0646\u0627 \u0688\u06cc\u0679\u0627 \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u0635\u0627\u0631\u0641 \u06a9\u0627 \u067e\u06c1\u0644\u0627 \u0627\u0631\u062a\u0642\u0627\u0621<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0627\u0628 \u0633\u06d2<\/strong><\/td>\n<td>\u067e\u0631\u0627\u0646\u0627 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0646\u0626\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 &#8211; \u067e\u06c1\u0644\u0627 \u0627\u0631\u062a\u0642\u0627\u0621<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0633\u06cc\u0631 \u0634\u062f\u06c1<\/strong><\/td>\n<td>\u062f\u0648 \u0631\u0627\u0633\u062a\u06c1<\/td>\n<td>\u0633\u0628 \u0633\u06d2 \u0645\u062d\u0641\u0648\u0638 \u0627\u0648\u0631 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u062d\u062f\u0648\u062f<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2<\/strong><\/td>\n<td>\u06a9\u0648\u0626\u06cc \u0686\u06cc\u06a9 \u0646\u06c1\u06cc\u06ba<\/td>\n<td>\u0635\u0631\u0641 \u062a\u0631\u0642\u06cc<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>FULL<\/code> \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u06d2 \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u067e\u0631 \u0645\u0637\u0627\u0628\u0642\u062a\u06d4 \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633\u06cc \u0645\u0648\u0636\u0648\u0639 \u067e\u0631 \u062a\u0645\u0627\u0645 \u0627\u06cc\u0648\u0646\u0679\u0633 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06cc\u06ba\u060c \u0642\u0637\u0639 \u0646\u0638\u0631 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0648\u0631\u0698\u0646 \u062c\u0633 \u0645\u06cc\u06ba \u0648\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u062a\u06be\u06d2\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u0627\u0633 \u0622\u0631\u0679\u06cc\u06a9\u0644 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0646\u06d2 REST\u060c gRPC\u060c \u0627\u0648\u0631 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0631\u0633\u0627\u0646\u06cc \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u0633\u06cc\u06a9\u06be\u06d2\u060c \u062a\u062c\u0627\u0631\u062a \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u067e\u0627\u0646\u0686 \u062c\u06c1\u062a\u06cc\u06ba \u062c\u0648 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0633\u06cc \u0627\u06cc\u06a9 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0627\u06c1\u0645 \u06c1\u06cc\u06ba (\u0644\u06cc\u0679\u0646\u0633\u06cc\u060c \u06a9\u067e\u0644\u0646\u06af\u060c \u0633\u06a9\u06cc\u0645\u0627 \u0627\u06cc\u0648\u0648\u0644\u0648\u0634\u0646\u060c \u0688\u06cc\u0628\u06af\u0646\u06af\u060c \u0627\u0648\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc)\u060c \u0627\u0648\u0631 \u0645\u062e\u0635\u0648\u0635 \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u06d2 \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0645\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u06cc\u0635\u0644\u06c1 \u0633\u0627\u0632\u06cc \u06a9\u0627 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9\u06d4<\/p>\n<p>\u0627\u06c1\u0645 \u0646\u06a9\u0627\u062a:<\/p>\n<ol>\n<li>\n<p><strong>\u06a9\u0646\u0627\u0631\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u0631\u0627\u0645 \u06a9\u0631\u06cc\u06ba:<\/strong> \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679\u060c \u0639\u0648\u0627\u0645\u06cc API\u060c \u0633\u0627\u062f\u06c1 CRUD\u06d4 \u06cc\u06c1 \u06a9\u06cc\u0634 \u0627\u06cc\u0628\u0644\u060c \u0688\u06cc\u0628\u06af \u0627\u06cc\u0628\u0644 \u0627\u0648\u0631 \u0639\u0627\u0644\u0645\u06cc \u0633\u0637\u062d \u067e\u0631 \u062a\u0639\u0627\u0648\u0646 \u06cc\u0627\u0641\u062a\u06c1 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u06af\u0631\u0645 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 gRPC:<\/strong> \u06c1\u0627\u0626\u06cc \u062a\u06be\u0631\u0648 \u067e\u0679 \u0633\u0631\u0648\u0633 \u0679\u0648 \u0633\u0631\u0648\u0633 \u06a9\u0627\u0644\u0632 \u062c\u06c1\u0627\u06ba \u0644\u06cc\u0679\u0646\u0633\u06cc \u0627\u06c1\u0645 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0646\u0648\u06ba \u0627\u0637\u0631\u0627\u0641 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0631\u062f \u0639\u0645\u0644 \u06a9\u0627 \u0648\u0627\u0642\u0639\u06c1:<\/strong> \u06cc\u06c1 \u0648\u06c1 \u0635\u0648\u0631\u062a \u06c1\u06d2 \u062c\u0628 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631\u0632 \u06a9\u0648 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u062c\u0628 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0633\u06af\u0646\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u06cc\u0627 \u062c\u0628 \u0639\u0627\u0631\u0636\u06cc \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u062c\u06be\u0691\u0646\u06d2 \u0648\u0627\u0644\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0648 \u0631\u0648\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u062a\u06cc\u0646\u0648\u06ba \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/strong> \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0646\u0638\u0627\u0645 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u06cc\u06a9\u062c\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0646\u0627\u0631\u06d2 \u067e\u0631 \u0622\u0631\u0627\u0645\u060c \u0627\u0646\u062f\u0631 \u06a9\u06cc \u0637\u0631\u0641 gRPC\u060c \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u0648\u0646\u0679\u0633\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0633\u06a9\u06cc\u0645\u0627 \u06af\u0648\u0631\u0646\u0646\u0633 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u062a\u0648\u0633\u06cc\u0639 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/strong> REST \u06a9\u06d2 \u0644\u06cc\u06d2 OpenAPI\u060c gRPC \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0631\u0648\u0679\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc\u060c \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc\u06d4 \u06af\u0648\u0631\u0646\u0646\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0627\u0633\u06a9\u06cc\u0645\u0627 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u06cc \u0627\u06cc\u06a9 \u0628\u0691\u06cc \u0648\u062c\u06c1 \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0635\u062d\u06cc\u062d \u0645\u0648\u0627\u0635\u0644\u0627\u062a \u06a9\u0627 \u0646\u0645\u0648\u0646\u06c1 \u0627\u06cc\u06a9 \u062c\u0627\u0645\u0639 \u0641\u06cc\u0635\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631\u060c \u062a\u0639\u0627\u0645\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0641\u06cc\u0635\u0644\u06c1 \u06c1\u06d2 \u062c\u0648 \u06a9\u0633\u06cc \u062e\u0627\u0635 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0628\u06c1\u0627\u0624 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0627\u0628\u0644 \u0642\u0628\u0648\u0644 \u062a\u062c\u0627\u0631\u062a\u06cc \u0628\u0646\u062f\u0634 \u067e\u0631 \u0645\u0628\u0646\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0645\u0648\u0627\u0635\u0644\u0627\u062a\u06cc \u067e\u0631\u062a \u06a9\u0626\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0641\u06cc\u0635\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0679\u06cc\u0645\u06cc\u06ba \u06a9\u0633 \u0637\u0631\u062d \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0646\u0627\u06a9\u0627\u0645\u06cc\u0627\u06ba \u06a9\u06cc\u0633\u06d2 \u067e\u06be\u06cc\u0644\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06c1\u0631 \u0628\u0627\u0631 \u0645\u0639\u0627\u06c1\u062f\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u06a9\u062a\u0646\u0627 \u062f\u0631\u062f \u0645\u062d\u0633\u0648\u0633 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u06cc\u0646 [&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-22490","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/22490","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=22490"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/22490\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=22490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=22490"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=22490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}