🔗

遠隔支援サービスLINKLETのシステムアーキテクチャの紹介

に公開

はじめに

こんにちは、プロダクト開発部の大森です。

Fairy Devices(以降、当社とします)では首掛け型ウェアラブルデバイス「THINKLET」を開発しています。

THINKLET

THINKLETは先端についているカメラで装着者視点の映像を記録し、
首元の5chマイクと当社の持つ音声処理技術により、高騒音な現場環境においてもクリアに装着者の音声を集音することができます。
さらに4GLTE通信が行えるため、こうして記録した映像や音声をネットワークを通して共有することができます。
これらを利用すると、装着者はハンズフリーで手元の映像を遠隔地に共有することができます。

こうしたTHINKLETの特徴を活かしたサービスとして、当社ではTHINKLETをWebブラウザから簡単に操作することができ、ZoomやTeams[1]といった既存のWeb会議サービスを使ってTHINKLETの映像を共有できる「LINKLET」というサービスを展開しています。
すでにZoomやTeamsを導入している企業であれば、THINKLETと合わせてLINKLETサービスを導入することで現場作業者がデバイス利用する際の負担を最小限にすることができ、導入コストを抑えることができます。

本エントリではこのLINKLETサービスにおけるシステムの全体像と、それがどのように運用されているのかを簡単に紹介します。

対象読者

  • 当社の持つプロダクトやサービスに興味がある方
  • 組み込みデバイスと連携するシステムの開発に興味がある方
  • Rust、もしくはReact + TypeScriptを使ったサービス開発に興味がある方

LINKLETについて

この章ではLINKLETとその周辺システムの関係について説明します。

LINKLETシステムの全体像

下の図はLINKLETサービスの全体像になります。

LINKLETシステムの全体像

当社が開発するWebサービスLINKLET Consoleを利用すると、THINKLETデバイスをZoomやMicrosoft TeamsといったWeb会議サービスに参加させることが可能です。
これにより、作業支援者と現場作業者が、簡単に映像&音声によるコミュニケーションをとれるようになります。
LINKLET Consoleでは、THINKLETのスピーカーの音量調整や、カメラを使った写真撮影などの操作ができるようになっており、現場作業者は特別な操作を必要とせずに、作業を行いながらTHINKLETのカメラを通して自身の手元の映像を作業支援者に配信できます。

また、THINKLETの管理を担っているCWS(Connected Worker Solution) APIというサービスをTHINKETのバックエンドアプリケーションとして当社で開発しており、LINKLETはCWS APIを利用する形で設計・開発されています。
LINKLETを利用することでTHINKLETのバッテリー残量などの情報取得や、手元映像の配信などを行うアプリケーション開発の手間を省くことができます。
CWSの詳細は下記記事で紹介していますのでそちらも合わせてご覧ください。
https://zenn.dev/fairydevices/articles/363c4231fb751a

LINKLETと各システムとの連携

作業支援者はLINKLET Consoleを使ってTHINKLETの状態を確認したり、THINKLETをZoomやTeamsに参加させてカメラ映像を配信させたりできます。LINKLET ConsoleはバックエンドAPIから情報を取得しています。
APIはデバイスのバッテリー状況やネットワーク状況をWebSocketを使ってリアルタイムにLINKLET Consoleに返しています。
THINKLETとのメッセージングにはMQTTを利用しておりCWSがMQTTブローカーとしての役割を担っています。
LINKLETは、CWSに対してリクエストするか、またはCWSからのWebhook経由でデバイス情報を受け取ります。
そのほかWeb会議サービスのミーティング情報をLINKLETに同期させるために、ミーティングの更新に対するWebhookも受信しています。

使用している言語・サービス

LINKLETのバックエンドにあるAPIはほとんどRust言語で開発しており、フロントエンドの開発にはNext.jsとTypeScriptを使っています。
バックエンドで使用しているWebフレームワークはサービスによって少し違っていて、actix-web + dieselで構成されているサービスであったり、axum + sqlxで構成されているサービスがあったりします。
フロントエンドではOpenAPIのドキュメントから型を生成するためにaspidaを使っていたり、データフェッチのためのライブラリとしてSWRを採用しています。
その他、AWS Lambdaで実行される定期バッチや運用ツールなどの多くはRustで開発しています。

LINKLETのインフラ構成

LINKLETはAWSのサービス上にデプロイされています。下がLINKLETのAWSの構成図になります。

LINKLETのAWS構成図

フロントエンドはAWS Amplifyを使って運用していて、APIサーバはコンテナとしてAWS ECS(Fargate)を使用したシンプルな構成にしています。
Fargateでの運用にあたりコスト最適化のためにスポットインスタンスも併用しています。
LINKLETに関するデータは基本RDSで管理していますが、保存するデータに応じてサービスを使い分けています。
例えば、THINKLETのミーティングログなどデータ分析に利用したいデータなどはDynamoDBで管理していて、THINKLETで撮影された写真などのマルチメディアデータの保存にはS3を使っています。
S3のデータコピーやDynamoDBのログ監視、RDBのデータ集計には主にLambdaを使っています。
サービスのデプロイメントにはCodePipelineを利用することで継続的デリバリーを実現しています。
また、これらのAWSリソースの管理にはAWS CDKというインフラ構成をコード化するためのフレームワークを利用しており、これによりIaC(Infrastructure as Code)を実践しています。
その他アプリケーションログの管理にCloudWatch、メール配信にはSES(Simple Email Service)を運用しています。

終わりに

今回は当社が開発・運用しているLINKLETについてやその周辺のシステムとの関係について紹介しました。
フェアリーデバイセズでは、エンジニアをはじめ一緒に働いてくれるメンバーを募集しています。
気になった方はぜひ以下をご覧ください。

https://open.talentio.com/r/1/c/fairydevices/homes/4010

脚注
  1. ZoomはZoom Meetings、TeamsはMicrosoft Teamsのことを指しています。 ↩︎

フェアリーデバイセズ公式

Discussion