サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
naruto-io.hatenablog.com
今回のエントリも前回に続きprotobufの数あるtypeの中から1つの使い方まとめていきたい。今回は google/protobuf/wrappers.protoをまとめていく。 protobufのtypeのなかにはプリミティブなtypeとしてstringやuint32, uint64などが用意されている。プリミティブなtypeをリクエストに定義した場合、リクエストに値を定義しないとデフォルト値がセットされる。 Language Guide (proto3) | Protocol Buffers | Google Developers gRPC Clientが明示的に値をセットしないとuint32では0値をgRPC Serverで受け取ることになる。 次のようなリクエストにつかうprotoを定義するケースを考えていく。 message TaskListInbound { uint
LogstashからElasticsearchへデータを送信する仕組みを試しました。Logstashのconfの参考になれば幸い。 json側のフィールドをElasticsearchのdate型にconvertしたり、文字列を数値にconvertしたりしました。 ログはjsonフォーマット {"reportDate":"2016-11-08 00:00:00","reportType":"report","gender":"female","ageBracket":"18-24","value":"269"} Logstashのconfファイル input { file { path => "/path_to_log_file" codec => "json" } } filter { date { match => ["reportDate", "YYYY-MM-dd HH:mm:ss"
Kotlin1.1からの新機能であるコルーチン(Coroutines)を試していきたい。Kotlin コルーチンをつかえば非同期処理を同期的なコードで書けるし、非同期処理をブロッキングすることもシンプルなコードで書ける。 今回はgRPC Serverへのリクエスト部分をコルーチンをつかい非同期化させてみたのでコードをまとめていく。 Serverへのリクエストは非同期化するが処理結果や例外処理をキャッチしたい メインのリクエストは非同期化するがgRPC Serverのレスポンスや例外処理を呼び出し元でどのようにすれば受け取れるだろうか。この場合にはコルーチンの結果を返すことができるasyncをつかいawaitで処理を中断してコルーチンから値を取り出す。 suspend fun getTask(taskId: Long): TaskOutbound = async(CommonPool) {
gRPCのプロトコル定義ファイル(.proto)の管理を考えていきたい。gRPCを導入するプロジェクトであれば.protoファイルの運用方法は課題である。 プロトコル定義ファイル(.proto)の運用課題 gRPCはプロトコル定義ファイル(.proto)から生成したプログラムをもとにサーバとクライアントに分かれ実装していくことになる。Microservicesではサーバとクライアントが別レポジトリに分かれ開発を行うことが多い。それぞれのレポジトリではマスタの.protoファイルを何処に置いて参照すれば良いだろうか。この課題は言語が違うクライアントとサーバ間でも同じことが言えるだろう。 そしてもう1つの課題は.protoファイルのバージョン管理だ。開発中のプロトコル定義に最新のプロトコル定義を干渉させたくない。開発中はクライアントとサーバは同じ世代のプロトコル定義を参照していることを再現しな
サービスのAPIのレスポンスタイムを監視することは運用において大事なことである。APIのレスポンスタイムを計測してモニタリングする方法は多様に考えられるが、このエントリでは次の図のようにALBのアクセスログをfluentdが収集してモニタリングツールと連携させることでAPIのレスポンスタイムの監視を実現していく。 ALBのアクセスログを有効にすると指定したS3のバケットにログファイルが貯まる FluentdはS3へアクセスしログを収集する 収集したログをElasticSearchへ転送しKibanaでモニタリング 収集したログを解析し収集インターバル中のアクセスのうち最大レスポンスタイムや平均レスポンスタイムを統計しMackerelへメトリックを投稿 Mackerelでレスポンスタイムが閾値を超えた場合のアラート体制を整える 上記の構成はログのモニタリングと合わせてレスポンスタイムが閾値を
KotlinでgRPCを試していきます。protocol buffersがkotlinに対応していないのでjavaに生成したものを使います。次のようなアプリケーション構成でKotlinを使ったgRPC通信を試してみました。 アプリケーション構成 エンドクライアントからのアクセスはGateway Serverが窓口となりHTTP/1.1で通信を行います。 Gateway ServerのバックエンドにいるgRPC ServerとはgRPC(HTTP/2)で通信を行います。 monitoring toolはGateway ServerとgRPC Serverの監視を行いHTTP/1.1で通信を行います。 モチベーション 何度かgRPCについてのエントリをまとめてきました。kotlinでgRPCを試してみたいと感じていたのとSpring Framework 5.0のリリースを控えた状況でSprin
Spring Boot 2.0.0 M1がリリースされました。以前のエントリで試した当時は 2.0.0.BUILD-SNAPSHOTでありHTTPサーバーが起動している状態でgRPCクライアントを動かすとエラーになっていた。 2.0.0 M1のリリースに伴いHTTPサーバーとgRPCサーバーが1つのjarに相乗りできるようになっているか確認するのが今回のモチベーション。 次のようなアプリケーション構成を実現したい。 API ServerはHTTP1.1のリクエストのルーティングとgRPCサーバーのエンドポイントを提供する API Serverに届いたリクエストはBackend Server向けのgRPCクライアントからBackend Serverにリクエストする API ServerとBackend Server間の通信はgRPCで行う エンドポイントにはHTTP1.1のリクエストのルーテ
FirebaseのFirebase Cloud Messaging(FCM)を試している。今回のエントリではFCMのJavaScriptライブラリを使ってブラウザにプッシュ通知やトピックにメッセージを送信する方法をまとめていく。 FCMではトピックや端末グループへのメッセージングなどの機能が利用できる。これらの機能をPush APIをサポートしているブラウザにも同様に利用することができる。 developers-jp.googleblog.com ここからはFCMのJavaScriptライブラリの使い方とサーバからメッセージを送信する方法などクライアントとサーバに分けてまとめていく。 クライアント クライアントではJasvaScript SDKを通してトークンを取得する。そのトークンをサーバに送りストレージに保持させる。 サーバではトークンを用いてFCMと連携を行い通知リクエストを送信する
Web Pushを試している。調べていく過程で2つの認証方式を用いてプッシュ通知を送信できることが分かった。1つはFirebase Cloud Messaging(FCM)を使い取得したサーバーキーを認証に使い送信する方法とVoluntary Application Server Identification for Web Push (VAPID)で認証をする方法である。 2つの方法としたがWeb Pushが標準化する過程で整理された認証方法であり、VAPIDのほうが後発となりFirebaseのサーバーキーを必要としない認証方式である。 VAPIDはFirebaseのプロジェクト登録が不要となるだけでプッシュサーバはFirebase Cloud Messagingが担っている。 今回のエントリではFCMとVAPIDそれぞれのWeb Pushのプッシュ通知方法をまとめていく。 また試したブ
HashiCorpからTerraform 0.9がリリースされました。「よし、最新バージョンにあげよう。」と作業をはじめましたがremoteコマンドが使えない。どうやら0.9からはremoteコマンドが廃止されたようです。このエントリではTerraform 0.9にバージョンアップをして0.8以前のterraform stateをマイグレーションする方法をまとめます。 remoteコマンドの廃止 remoteコマンドが廃止になりました。代わりにbackendsを利用してS3などのremoteにあるtfstateファイルの管理を行います。 remote stateがbackendsに置き換わる過程は次のPull Requestから確認できます。 github.com 0.8以前を利用している場合はbackendを有効にしたtfstateファイルを用意する必要があります。次からは0.8.xまで
今回はE2EテストをつくれるTestCafeをつかってみたエントリです。 devexpress.github.io 以前のエントリではSelenideをつかったE2Eテストの紹介をしました。Selenideも特徴がありますがTestCafeも抜群の特徴があります。 TestCafeではテストコードはNodeで書いていきます。そのため広くエンジニアメンバーがE2Eテストを書けるメリットがあります。ES2016 using をつかってテストコードが書かれているためasync/awaitなどの特徴的な構文も使えます。 最大の特徴はテストをリモートで実行できること TestCafeのプリインストールでテストするブラウザとしてchromeとsafariが用意されています。ブラウザを指定したテストの実行は次のようになります。 実行するとchromeとsafariが立ち上がり`tests/test.js
以前のエントリでKotlinでSelenideを使ったE2Eテストを作ったときもPage Object Patternを利用して見通しの良いテストコードが書けました。TestCafeでも同様にPage Object Patternを利用することが推奨されています。 今回はTestCafeでもPage Object Patternを利用してテストを書いてみました。 何をテストするか 次のサイトのログイン認証をテストします。 freshlive.tv テスト内容としては次のとおりです。 認証画面のURLを開く IDとパスワードを入力する ログインボタンをクリックする ログインが完了するとHome画面にリダイレクトされるので正しくリダイレクトされているか ログインが完了するとヘッダーモジュールにアカウント名が表示されてるので正しく表示されているか テストコードのフォルダ構成 プロジェクトのフォル
今回はgRPCをマイクロサービス間通信に導入することってメリットあるよね、というエントリです。 定期的に処理を実行してくれるバッチはよくあるものですがバッチの駆動をgRPCを使って次のような構成で動かしました。 Batch ControlとBatch ServerはBidirectional gRPC streamingでコネクションする。 Batch ControlはRedisのPub/Subで特定のチャンネルを監視する。 Batch Controlはチャンネルにキューが投げられたらBatch Serverへバッチ処理スタートのリクエストを送る。 Batch Serviceはリクエストを受け取りバッチを動かし処理結果をBatch Controlに送る(レスポンスを送る)。 チャンネルにキューが投げられる度に上記の流れでバッチを稼働させる。 上記の構成を踏まえ次からはメリットをまとめます。
1ヶ月ほどkotlinで開発をしてきて、不慣れなkotlinであってもテストをしっかり書いていこうと目標を立て臨んだ1ヶ月。 おかげでkotlinにおけるMockテストの知見が溜まってきたので、この機会にまとめていきます。 javaではJMockitでMockテストを書いてきたけど、いざkotlinでとなると弊害が多くMockitoやPowerMockに置き換えながら試していった。 どんなテストをするのか トランザクションで扱う複数の関数のテストを次のように実現できるとプログラムを網羅的にテストできるでしょう。 クラス全体のパブリック関数のモック クラス一部分のパブリック関数のモック 呼び出す関数の引数のモック(anyString()やany()を使う) クラスのプライベート関数のモック クラスのプライベート関数のアサーションテスト 何をつかったか 次のテストライブラリを使いました。 gi
「アプリケーションで出力したログをelasticsearchにインデックスするときにログ時間のフィールド名を@timestampにしたい。」 こんなときにfluentdのlogstash_formatを使うと少々はまります。 今回はそのハマりポイントと解決についてのお話です。 なぜログ時間のフィールド名を@timestampにしたいか 先々にkibanaでもログを取り込むことを考えていました。(kibanaではログ時間のTime Fieldの扱いが@timestampとなっています。) アプリケーションから出力されるフィールドはtimeのままで@timestampにしたくありません。 logstash_formatを使えばtimeフィールドを@timestampに変換してくれますが難点があります。 logstash_formatを使わない理由 logstash_formatはfluentd
今回はConsumer-Driven Contract testingのサンプルを作ってみました。以前のSelenideを使ったE2Eの記事の流れからConsumer-Driven Contract testingも試してみようというモチベーションです。 Consumer-Driven Contract testingとは Consumer-Driven Contract(以下、CDC)で検索すると定義についての記事がたくさん見つかりますので詳細な説明は他の記事にお任せします。 Consumer-Driven Contracts testingを徹底解説! - Qiita Consumer-Driven Contracts: A Service Evolution Pattern CDCテストはmicroservice architectureをベースに複数のmicroserviceでサー
気になっていたElasticsearchのScroll APIの使用感を記録します。最近の開発でScroll APIを採用したい欲求がありましたが、使用感を調べる前で採用は見送りました。このままだと気になったまま使わないことになりそうなので、この機会にまとめます。 www.elastic.co ※ version 2.4をつかいました。 Scroll APIは通常のSearch requestのoffset/limitでページング取得をしないため処理中のデータ抜けが防げるメリットがあります。またScroll APIは初回リクエスト時の結果をスナップショットすることで安定した応答速度を担保します。 スナップショットをとるためリアルタイムのデータ処理の利用には向いていません。(スナップショットの挙動について試してみたので後述しています) どんなふうに使うか? 通常のクエリとscroll=1mを
タイトルのdocker-composeをつくっていきます。ローカルで配信確認したいときにシュッと起動できるようにします。 次のような構成でつくりました。 コンテナ構成 それぞれのコンテナについてまとめます。 RTMP server nginx-rtmp-moduleをつかってRTMP serverをたてる。 github.com RTMP serverは`rtmp context`でストリームを受け取るapplicationを追加(`application encoder`)。 `application encoder`はストリームを受け取るとFFmpegで動画を3つのビットレードにエンコードする。 `application encoder`でエンコードした動画をHLS変換する`application hls`へストリームする。 `application hls`は変換したm3u8、tsフ
Consumer-Driven Contract テストをフレームワークさせるPactをつかったサンプルプロジェクトを前回のエントリでは紹介しました。 naruto-io.hatenablog.com 前回のエントリではPactファイルをConsumerとProviderともにファイルシステムを用いて参照していました。 Pact Brokerを導入すればPactファイルのレポジトリ環境が構築できます。 今回のエントリではPact Brokerの構築を紹介します。 Pact Broker Pact Brokerはこちらのgithubレポジトリから参照できます。 github.com Pact Brokerの特徴を抜粋すると ConsumerとProviderの間のPact共有の課題を解決する Pactの管理をPact Brokerが一元管理するためConsumerとProviderともにPa
プロジェクトでGO言語に触れながら学習のためにコマンドラインツールを作り拡張させながら言語理解を深めようと目標を立てた。「みんなのGO言語」を参考にしながら自作のコマンドラインツールを作ったのでまとめます。 みんなのGo言語[現場で使える実践テクニック] 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太出版社/メーカー: 技術評論社発売日: 2016/09/09メディア: Kindle版この商品を含むブログを見る どんなコマンドラインツールを作ったか ec2インスタンスをタグ検索してインスタンス情報を取得できるコマンドラインツールを作りました。 生成したインスタンスリストをpecoでインクリメンタルサーチできるようにして選択したインスタンスにsshできるようなzsh関数も合わせて作りました。 作ったサブコマンドとpecoを組み合わせればインスタンスへのssh接続が快適に
昨年末のAdvent Calendarを読み漁ってたときにSelenideやE2E、kotlinなどのキーワードが頭に残っていました。キーワードを全部ひっくるめてkotlinでSelenideを使いE2Eテストをつくってみたいなぁと思いを馳せていたところ、プロジェクトでもE2Eテストの必要性が高まっている機運を感じ保守性と拡張性が高い設計を考えながらkotlinでE2Eテストアプリケーションをつくってみました。 はじめに Selenideについて SelenideはSeleniumeのラッパーです。 selenide.org SelenideではWebDriverは自動で閉じたりElementの取得にCSSセレクタが使えます。かなり使いやすい感じになっています。 Selenium WebDriver: WebElement customer = driver.findElement(By.
このページを最初にブックマークしてみませんか?
『naruto-io.hatenablog.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く