آشنایی با Webhook

یکی از مفاهیمی که در سرویس‌های مختلف بکتوری، مخصوصا سرویس بلادرنگ، از آن استفاده شده است، مفهوم وب‌هوک می‌باشد. استفاده از وب‌هوک‌ها قابلیت‌های گسترده‌ای را برای توسعه‌دهندگان فراهم می‌کنند. در این مستند قصد داریم تا با این مفهوم بیشتر آشنا شویم.

وب‌هوک چیست؟

وب‌هوک به یک فراخوانی (callback) از جنس HTTP در سمت سرور گفته می‌شود که توسط برنامه‌نویس تعیین می‌شود. این درخواست غالبا با متد POST بوده و در هنگام بروز یک رخداد خاص صدا زده می‌شود.

به عنوان مثال، فرض کنید یک مخزن روی سایت گیت‌هاب دارید و می‌خواهید هر بار که به آن مخزن push می‌کنید، به نحو خاصی به شما اطلاع داده شود (مثلا به حساب تلگرام شما یک پیام ارسال شود.) در این صورت، یک سرویس تحت وب ایجاد می‌کنید که هربار url مربوطه‌اش صدا زده شود، این رخداد را از طریق تلگرام به اطلاع شما برساند. سپس url سرویس تحت وب ایجاد شده را در بخش Webhook از تنظیمات مخزن‌تان اضافه می‌کنید.

در سرویس بکتوری وب‌هوک می‌تواند به اهداف مختلفی صدا زده شود. ممکن است شما بخواهید وقتی اتفاق خاصی رخ می‌دهد، تابع دیگری trigger شده و به طور موازی اتفاق بیفتد؛ مثلا، می‌خواهید وقتی همه‌ی بازیکن‌ها به سرور بازی وصل می‌شوند و بازی می‌خواهد آغاز شود، از تعداد الماس‌هایشان به اندازه‌ی مشخصی کم شود. یا ممکن است بخواهید وقتی کاربر می‌خواهد عمل خاصی انجام دهد، ابتدا بررسی شود که آیا حق انجام آن کار را دارد یا خیر؛ و در صورت اعتبارسنجی اجازه‌ی انجام آن عمل به کاربر داده شود. مثلا وقتی بازی می‌خواهد آغاز شود، اگر تعداد الماس‌های کاربری کافی نیست، به او اجازه‌ی بازی داده نشود.

وب‌هوک همگام و ناهمگام

وب‌هوک‌ها به دو دسته‌ی همگام و ناهمگام دسته‌بندی می‌شوند. به زبان ساده، همگام (sync) بودن وب‌هوک به این معنی است که اجرای تابعی که در میان آن وب‌هوک صدا زده می‌شود، با این فراخوانی و تا زمانی که پاسخ وب‌هوک برگردد، متوقف می‌شود و این جواب در ادامه‌ی روند اصلی مورد استفاده قرار می‌گیرد. نمونه‌ای از وب‌هوک sync در بکتوری، وب‌هوک PreMatchmaking است.

در سمت مقابل، وب‌هوک ناهمگام (async) به این صورت است که اجرای آن موازی با روند اصلی اتفاق می‌افتد و موفق یا غیرموفق بودن اجرای وب‌هوک و خروجی آن، تأثیری در روند اصلی ندارد. البته این به این معنی نیست که خروجی وب‌هوک async الزاما بلااستفاده است؛ بلکه ممکن است خروجی آن در جای دیگری مورد استفاده قرار گیرد. مثلا در بکتوری، وب‌هوک Start گرچه async است، اما وقتی پاسخ‌اش آماده می‌شود، پیام «آغاز بازی» به کلاینت‌های اندروید و یونیتی ارسال می‌شود.

نکته‌ای که در رابطه با وب‌هوک‌های همگام و ناهمگام باید به آن توجه شود، این است که با توجه به این‌که وب‌هوک async به طور موازی با روند اصلی یک سناریو اتفاق می‌افتد، در نتیجه اگر در حین اجرای وب‌هوک exception رخ دهد، یا این که timeout شود، اجرای روند اصلی تحت تأثیر قرار نمی‌گیرد. اما وقتی وب‌هوک sync داریم، خیلی از اوقات باید حتما جواب برگردد و با فرمت درستی هم برگردد. در غیر این صورت، اگر جواب برنگردد، فراخوانی آن از سمت سرور timeout می‌شود؛ و اگر جواب با فرمت نادرستی برگردد، کدی که آن را فراخوانی کرده، نمی‌تواند پاسخ را به درستی parse کند و با خطا مواجه می‌شود.

بنابراین، دقت کنید که در وب‌هوک‌های sync، در صورتی که نیاز بالا ذکر شده باشد، حتما کد سمت سرور را به گونه‌ای پیاده‌سازی کنید تا پاسخ به درستی برگردد! یعنی خطاهای مختلفی که امکان وقوع دارند، را به درستی مدیریت کنید؛ وگرنه روند اصلی‌ای که باعث فراخوانی وب‌هوک شده نیز دچار مشکل می‌گردد و پاسخ درستی به کلاینت‌ها برنمی‌گردد.