Webhooks - 1日の3日目


この記事は#25DaysOfServerless . 新たな課題は、毎日12月のマイクロソフトクラウドの提唱者から公開されます.マイクロソフトAzureがあなたのServerless functions .
アイデアや解決策がありますか?
APIは、Webの分散アーキテクチャを構築できるようにしたものです.考えてください.あなたは正しいコードの小さな行の右側の量を右することができます本当に強力なことを行う.たぶん、あなたはあなたのために支払いを集めるためにストライプを尋ねたいです、あるいは、あなたはAutos 0にユーザーがあなたの顧客であると確認するように言いたいです.おそらく、あなたはメールを介してユーザーに通知したり、販売のフォローアップのためのカレンダーイベントをスケジュールします.
最後に、あなたは地面から彼ら自身のどれかをしたコードを書きましたか?たぶん、決して.しかし、あなたはよくテストされ、耐久性のあるAPIサービスを持っています.時間のテストを経て、高い立っているサービス.あなたがする必要があるすべては1です.2 . 3、プラグアンドプレイ!
あなたのウェブサイトによって引き起こされなかった何かが起こるとき、あなたはあなたに彼らの終点に通知して欲しいです.これはあなたがそれを要求しなかったことを意味します.したがって、任意の応答を期待していません.
有料サブスクリプションをキャンセルするか、コミットがあなたのウェブサイトが内容を引き上げるレポになされたと考えてください.あなたはおそらく、前者のユーザーにフォローアップするか、おそらくGithubから新鮮なコンテンツを削除するには、キャッシュをフラッシュします.
後者は、25 DaysSerververlessウェブサイトを構築するとき、我々のケースでした.

Webhook呼び出しはAPIコールの反対です


あなたのウェブサイトまたはサーバーがデータのAPI終点への呼び出しをするならば、それはAPI呼び出しです.サービスプロバイダが自分のカスタムAPIエンドポイントを呼び出してデータを送信する場合は、Webhookです.
25 daysofververlessウェブサイトのために、我々はGitHubにすべての挑戦を格納して、アクセストークンとGithub APIを使って彼らをフェッチしました.フロントエンドのためのワークロードを減らすために、私たちは、Serverless API上でMarkdownを処理することに決めました.しかし、物事は醜い、実際に迅速に得た.
プロセスは、Markdownを解析して、CDNにMarkdownのイメージをアップロードしなければならないことを意味します.そして、クライアントに送る前に、イメージをCDNからダウンロードします.基本的に、あなたがウェブサイトで挑戦を求めるとき、我々は2つのさらなる要求をプラスしているMarkdown構文解析をしています.それぞれの要求は、プロセスに8秒以上かかりました.
心に浮かんだ最初のことはキャッシュすることです-我々はしました、そして、我々はみんなのお気に入りのために行きました.

キャッシュは、2秒以下に各チャレンジのトータルレスポンス時間をもたらしたが、支払うべき価格があった.
async function processRequest(week, day) {
  const challengeFromRedis = await redisGet(client, pathToChallenge);

  if (challengeFromRedis) {
    console.log('challenge is cahced');
    return { content: challengeFromRedis };
  } else {
    console.log('challenge not in cache, yet');
    const response = await fetchChallenge(week, day);

    // Process markdown
    const decodedReadme = decodeContent(response.data.content);
    const markedContent = await parseMarkdown(decodedReadme, week, day);
    const content = Object.assign(response.data, { content: markedContent });

    // Add to redis cache
    await redisSet(client, pathToChallenge, content.content);

    // Return processed markdown
    return { content: content.content };
  }
}
ご覧の通り、我々はチャレンジがキャッシュされているかどうかをチェックしている.キャッシュされていればキャッシュ値を返します.キャッシュされていない場合、我々は、キャッシュに挑戦を追加し、チャレンジを返します.
私はこれを開発するのにかなりの役割をして、現実が翌朝私のドアをノックするまで、その応答時間をもたらすことについてとても良い感じがしました.私の同僚が追加したり、Githubの課題を更新、何が起こるか推測?
ユーザーはキャッシュされた値を見続けた-ルーキーミス、ハウ?
私は、キャッシュを更新させ続けるために引っ張ることができたすべての魔法のことを考えて、片隅に座りました.私は、Githubに行った真夜中のcron仕事を考えて、新しいコミットがあるかどうかチェックしました.私が私の問題と私のマンガを共有した私たちの次のスタンドアップまで、大きな回避策のようなフェルト、シモナは私たちのオーブンから熱い最高の答えを取り出しました.
webhooks!
我々がする必要があるすべては、我々がコミット/プッシュがなされるとき、我々がそれを与えるURLへのポスト要求を送るために、Githubに尋ねます.このように、要求を受け取ると、キャッシュをクリアするServerless関数を実行できます.

Githubウェブフックの作成


これはBと同じくらい簡単だった.
あなたがフックを加えることを望むrepoの設定に行ってください、あなたが管理者特権を持っていることを確認してください

イベントをプッシュし、webhookを保存できるようにしてください.ファイルコミットを編集し、GithubはPOSTメソッドといくつかのデータを使用してそのURLを呼び出します.
Serverless関数を使用して自分でURLを作成する方法を紹介します.

Webhook URLの作成


Webhook URLは、レギュラーエンドポイントです.唯一のことは、それがポストリクエストを介してペイロードを受け取ることができることを知っているということですreq.body .

  • Create and deploy ちょうどVsコードでの無制限関数.
  • Webhookが呼び出すことができる関数を作成します.
  • 以下に関数の例を示します:
    const redis = require('redis');
    const promisify = require('util').promisify;
    
    module.exports = async function(context, req) {
      // Connect to your redis client
      const client = redis.createClient(6380, process.env['REDIS_CACHE_HOSTNAME'], {
        auth_pass: process.env['REDIS_CACHE_KEY'],
        tls: { servername: process.env['REDIS_CACHE_HOSTNAME'] }
      });
    
      const flushAsync = promisify(client.flushdb).bind(client);
    
      // Clear cache
      await flushAsync();
    
      context.res = {
        body: 'Cache cleared'
      };
    };
    
    このチャレンジにあなたのソリューションを提出したいですか?ローカルソリューションをビルドしてからsubmit an issue . 解決策がコードを含んでいないならば、あなたは短いビデオを録画して、問題記述で関連としてそれを提出することができます.解決策は、どのチャレンジを教えてください.私たちはあなたが構築を参照してくださいに興奮している!コメントや質問はありますか?以下のコメント領域に追加します.
    月の間にすべての驚きのために見て、我々はServerlessの25日を祝う.私たちは、課題と解決策を備えています.Aにサインアップするfree account on Azure 課題の準備をしてください!