golang.tokyo #4 参加レポート #golangtokyo

投稿者: | 2017/03/04


golang.tokyo #4にブログ枠として参加してきました。
ブログ枠なのにレポートを上げるのが遅いのはご容赦ください。

golang_tokyo_4

参加理由

今の会社ではGo言語を使っていないのですが、個人的に勉強していて社内勉強会をやるようになりました。
プロダクトで使っていないので殆どの参加者は私含めGo言語初心者です。そのため、他社ではGo言語でどういったことをやっているのかを知りたいなと思いました。
また、今回のテーマが「Concurrency」で、イマイチ理解できていないところだったので、勉強しに行きたいと思ったので参加しました。

一般参加枠が定員を大幅にオーバーしており、抽選結果が出るまで予定が決まらないのが不安だったので、丁度空きがあるブログ枠として参加しました。
(LT枠はまだハードルが高くて断念しました)

ブログ枠について

主催者の @tenntenn さんによると、毎回枠が埋まるのが遅いらしく、勉強になるし、ビュー数稼げるしいいことあるよ!とのことでした。
確かに、こういった機会がないとブログにまとめることがない(正直億劫になって書かない)ため、ネタをもらったと思ってブログ記事が書ける良い機会なので、他の方も次回以降は狙っても良いのではないでしょうか。

会場

株式会社エウレカさんでした。
以前はオフィスが恵比寿だったなと記憶していたのですが、昨年の8月頃に移転したとエウレカの人に教えてもらいました。
めっちゃキレイなオフィスでした。羨ましい!

eureka

golang.tokyoについて

勉強会の冒頭でgolang.tokyoについての説明がありました。
Go言語の導入企業のメンバーで集まっている言語コミュニティとのことです。Go言語を導入している会社の人は参加できる良い場ですね。
動画の撮影もありました。毎回募集数が多いので、後ほど公開するためだそうです(ライブ配信ではないとのこと)。

Concurrency for distributed Web crawlers

分散されたWebクローラーのための並行実行

末田 卓巳氏 (@puhitaku)

Golang歴半年だそうです。

  • 何のためのWebクローラーなのか
    • アプリに関する情報をAppStoreやGooglePlayから収集するため。
  • システム要件
    • Banされないためにする
      • シングルドメインからクロールするとバンされる
    • 24時間以内毎日クロールしないといけない!
      • 画像のダウンロードもしているので一回毎のクロール時間が異なり、時間制御が難しい
  • 一からつくろう!
    • informant
      • 公開はしていない
  • 役割
    • Crawler
      • クローリングする
      • Amazon EC2 Container Service(AWS ECS)に配置
      • SQSからクローリング対象をデキュー
      • データはDB(DynamoDB)に、画像はS3にアップロード
    • Commadner
      • クローラーの数を増減させて制御
      • スケーリング
      • アプリリストの情報をSQSにエンキューする
        • キューの数(アプリリストの数)だけEC2インスタンスが立ち上がる
        • 現在は29ぐらいのインスタンス
        • 1つひとつのEC2インスタンスににPublicIPアドレスがつくからBANされにくい
  • 24時間以内に終わらせるためにGolangを使う
  • S3にアップロードする時間が可変(画像サイズがそれぞれ異なるから)
    • クローラーごとにバラバラ
    • ゴルーチンで時間制御
      • 時間制限を設けて過ぎたら別ゴルーチンでクローリングする
    • 3秒間に一回 go文を実行
  • Slack bot でInformantを動かす仕組み
    • クローラーの状態を通知
    • 一日数回チェックする
      • 毎回Slack通知するの?楽にしたい
    • Slackにはメッセージを編集機能がある
      • botも使える
      • github.comnlopes/slack
      • ユーザのインタラクションで表示内容を変えてくれる
  • 落とし穴
    • 早いクエリだと問題ないけど、遅いと並列数が増えてしまってTCPコネクションが枯渇する
    • Limit Chan
      • 数を制限するチャネル
      • キャパシティを指定して、キャパシティがいっぱいになるとブロックされる

Goのスケジューラー実装とハマりポイント

https://talks.godoc.org/github.com/niconegoto/talks/concurrency.slide

Koki Ide 氏 @niconegoto

アドベントカレンダーでゴルーチンのスケジューラについて書いたらバズった。

  • ゴルーチンの実装パターン
    • M:N (多対多)
      • コンテキストスイッチを素早く実行してシステム内のすべてのコアを活用してくれる
      • スケジューラの追加が煩雑だけどゴルーチンはうまくやってくれている
  • 用語
    • M(Machine) => OSスレッド
    • G(Gorunie) => ゴルーチン
    • P(Processer) => コンテキスト、CPUコア数
  • Pの数は環境変数 GOMAXPROCSGOMAXPROCS()で決まる
    • 個々のコンピュータに合わせることができるCPUコア数が4なら GOMAXPROCS を4にすると、4つのスレッドでGoコードを実行する
  • go文が実行されるとMはリストからPをポップする
    • runqueuesというキューのリストからGを取り出す
  • 待機しているGが無くなる(偏ると)他のPから半分奪ってくる
  • GOMAXPROCS が1でも複数スレッドでGoが実行される
  • ハマリどころ
    • スケジューラーが切り替わるタイミング
    • システムコール
    • メモリの割り当て
    • time.sleep()
    • rutime.Gosched()
  • 参考

Ridge – A framework like GAE/Go on AWS –

fujiwara 氏

  • Ridge とは
    • AWSでGAE/Goみたいなことをやる
  • AWSサービス
    • API Gateway
      • Proxy integration
      • HTTPメソッド: ANY
      • 任意のHTTPリクエストがObjectになってLambdaで実行
      • Lambdaで返したObjectをAPI GatewayでHTTPレスポンス
    • Lambda
      • API Gatewayから来たリクエストを処理
  • 課題
    • 独自オブジェクトで指定したい
    • ルーティング
    • テスト
    • Goで書きたい
  • Apexを使う
    • Goで書ける
    • Goのバイナリを同梱し、子プロセスとして起動
    • 標準入力/標準出力でプロセス間通信
  • デプロイ簡単
    • $ apex deploy
    • Goのビルド、zip作成、Lambdaにデプロイしてくれる
  • API GatewayのObjec と Goのnet/httpを相互変換すれば動くのがEidge
  • ridge.Run() 以外は普通の net/http アプリケーションコードと同じ
  • ridge.Run() でしていること
    • API Gateway Proxy Integration と net/http の相互変換してくれる
    • Apex(Lambda)で動かなさい場合は普通に http.Serverを起動する
      • 環境変数 APEX_FUNCTION_NAME で判定している
  • Ridgeのいいところ
    • テストは httptest で
    • API Gateway + Lambda という構成
      • EC2の管理なし
      • 自動でスケールしてくれる
      • 使った分だけ課金される
  • Ridgeでできないこと
    • 複数URL引数
    • 同一複数HTTPヘッダ
    • バイナリを返す
      • 今後に期待
    • 裏でゴルーチンを動かし続けれない
      • Lambdaの制約でリクエスト処理をおえるとプロセスが眠ってしまう
    • 1リクエスト10秒を超える処理
      • API Gatewayの制約(タイムアウト)
  • 向いていないこと
    • 低レイテンシ
      • API Gatewayを挟むと20msぐらい遅くなる
  • 向いていること
    • webhook を受けるSlack bot
    • S3のリポジトリビューア
    • サービスが終了したゲームの告知API
      • POSTをうけてJSONをかえす
  • ログの取扱い
    • Cloudwatch Logsはいいお値段 + 見づらい
    • Lambdaに流して ridge.DecodeLogStream() で見やすくする

懇親会&ライブコーディング

@kaneshin0120 氏

tailコマンドを実装する
ソースコードはこちら↓
https://gist.github.com/kaneshin/a398720b8e20722a83bc6903e4017435

嫁に怒られずにGoを書く技術

@teitei_tk 氏

  • GoでLINEのチャットBotを作った
    • Slack Botにしたかったが、家族がLINEを使いたい
    • 現在、日本で一番使われているであろうチャットサービス
  • 必要なもの
    • Goがインストールされているサーバ(インターネットにつながっていることが条件)
    • ドメイン × 1
    • SSL/TLS証明書(Let’s encryptも可)
  • やること : 今日の天気を通知する
  • 天気情報の取得
  • 家族とのLINEグループにBotをいれる
  • 実際に手をつけようとしているもの
    • 漫画の新刊がでたときに
    • Googleカレンダーのリマインダー
    • ToDoリスト
  • 嫁駆動開発にBot開発はオススメ
  • LINEもSlackやHipChatと同じように使える

Gogland – Up and Comin Go IDE

Sergey Ignatov ( @sergey__ignatov ) / JetBrains
Goglandの作者

英語を聞いていましたが、今の英語力だと限界なのでメモを並べます。
プレゼンはデモしながらなので言いたいことは何となくわかりました。

  • IntelliJ IDEAにプレゼンモードがあるのか。発表の場で使いやすそう
  • ショートカットを駆使している
    • めっちゃスムーズ
    • コーディングがより一層楽しくなりそう
  • 関数一覧で引数名がみえる
  • 関数リストとは別窓で関数の中身がみえる
  • ワイルドカードで検索できるのはよいね
  • メソッドからInterfaceに飛べる
  • 変数の型がポップアップで表示される
  • 曖昧な入力でも補完してくれるのはいいね
    • fmPri -> fmt.Println
  • テストをすぐ実行できて失敗してもコケたところにすぐ遷移できる
  • メソッドがどのPackageからImportされたか表示してくれる
  • 何かあったらIssue Tracker

Goglangは使ったことがなく、IntelliJ IDEA Goプラグインを使っていましたが、それよりパワーアップしている印象なので試してみたいと思います。

最後に

他社事例など聞けて参考になったし、楽しかったですが、Concurrency初心者な自分としてハードルが高く感じました。
次回参加するときまでにはGolang書きまくってレベルアップしていきたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*