4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

.NET 6 と Daprを使った分散サービス開発 その8 Bindingのトリガ

Posted at

Input Binding (入力バインディング)を使って随時処理を行う

前回は、Daprに備わっているInput Binding (入力バインディング)の中で、RabbitMQからキューをエントリしたらトリガされる方法に触れてきました。

今までの前提の上で入力バインディングの機能を追加しますので、このページから読まれている方は、前提として以下を読んできてください。


バインディングをトリガする

前回は、RabbitMQの管理コンソールからメッセージを投稿したら、Daprによってイベントがトリガされる様子まで進めてきました。
今までは、スケジューラーから自動でトリガされる、RabbitMQのQueueにenqueueしたらトリガされるなどを見てきましたが、今回はトリガする方に着目して進めていきます。
また、Service Invocation(サービス呼び出し)と異なるのは、非同期処理であるという事です。例えば、PDFの生成、動画のエンコード、画像処理など時間のかかるであろう処理は、その場で応答する前にタイムアウトする事が考えられますので、こちらの実装が適しています。

image.png

以下も併せて見てもらうとわかりますが、これはOutput Bindingのコールと同じです。

image.png

RabbitMQがInput / Output双方のバインディングに対応しているので、今回はこれを使ってバインディングのトリガを行ってみる事にします。

Appプロジェクトの変更

今まで作成してきたプロジェクトの中でフロントのAPIを担っているAppプロジェクトに新しくコントローラーを追加し、ここでトリガします。

image.png

Dapr SDKのDapr clientを通じて、payloadになるデータを作成し、InvokeBindingAsync("バインドの名前", "create", payloadData);という感じで送っています。

InvokeTriggerController.cs
using Dapr.Client;
using Microsoft.AspNetCore.Mvc;

namespace App.Controllers;

[ApiController]
[Route("[controller]")]
public class InvokeTriggerController : ControllerBase
{
    private readonly ILogger<InvokeTriggerController> _logger;

    private readonly DaprClient _daprClient;

    public InvokeTriggerController(ILogger<InvokeTriggerController> logger, DaprClient daprClient)
    {
        _logger = logger;
        _daprClient = daprClient;
    }

    [HttpGet(Name = "GetInvokeTrigger")]
    public async void GetAsync()
    {
        var payloadData = new
        {
            message = "from App to Worker via dapr component with RabbitMQ",
        };
        await _daprClient.InvokeBindingAsync("Rmq", "create", payloadData);
        Console.WriteLine("Binding sent.");
    }

}

componentの修正

各コンポーネントに対して、scopes:を設定してバインディングを扱えるアプリを制限していたのを覚えていますでしょうか?前回はworker-serviceのみのアクセス許可になっていましたから、appからもバインディングを扱えるように設定追加をします。

rabbitmq.yaml
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: Rmq #バインディングの名前はRmq
spec:
  type: bindings.rabbitmq
  version: v1
  metadata:
  - name: queueName
    value: daprexchange
  - name: host
    value: amqp://guest:guest@localhost:5672
  - name: durable
    value: true
  - name: deleteWhenUnused
    value: false
  - name: ttlInSeconds
    value: 60
  - name: prefetchCount
    value: 0
  - name: exclusive
    value: false
  - name: maxPriority
    value: 5
  - name: contentType
    value: "application/json"
scopes:
- worker-service
- app # 新たにappからもアクセスを可能に

WorkerService側は、前回の状態のままにしておきます。

起動と確認

編集を終えたら、tye runで起動しましょう。

$ tye run
Loading Application Details...
Launching Tye Host...

[14:44:48 INF] Executing application from tye.yaml
[14:44:48 INF] Dashboard running on http://127.0.0.1:8000
[14:44:48 INF] Build Watcher: Watching for builds...
...

今までと同じ要領で、Tye ダッシュボード http://127.0.0.1:8000 をブラウザで開きましょう。tye ダッシュボードから、それぞれAppのログ、Worker-serviceのログも開いておきましょう。

image.png

また、RabbitMQ側もQueueが届いているのがわかるように管理コンソールを開いておきます。
http://localhost:15672/#/queues/%2F/daprexchange

image.png

今回の確認ポイントは、App側でInvokeTriggerをGETしたら、RabbitMQにenqueueして、その後WorkerService側が受け取っている事となります。

appは https://localhost:62629/ で起動していますので、https://localhost:62629/swagger からAPIをテストします。

image.png

問題なく、200が返却されました。この時点でバインディングを呼び出しているはずです。

image.png

RabbitMQにもenqueueされています。

image.png

App側のログにも、Binding sentが記録されています。

image.png

Worker側のログにも、届いたメッセージが表示されました。

image.png

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?