のんびりやの日記

のんびり、たまに更新。

discord.pyでシャーディングして大規模なBotを運用する

喋太郎の規模が大きくなってきたので、複数のサーバでBotを運用する方法を探してたのだが、日本語のドキュメントが全くない(全ギレ)。 色々試行錯誤しながらなんとか実現できたので、同じ悩みを持っている方のために書いていく。大規模Botを開発できるぐらいなんだから英語くらい読めるだろっていうツッコミは無しで。(読めない人) pythonでやる場合について書いてるけど、他の言語でやっても同じだと思うので参考にしてもらえたら。雰囲気で書いてるので、間違ってたらコメントで教えていただきたい。

※2019 5/16 コメントで指摘があったため、良さげな形へ訂正

喋太郎については以下の記事から nonbiriyanonikki.hatenablog.com

シャーディングって何

よくわからない。俺たちは雰囲気でシャーディングしている。

何ができるようになるの?

複数のプロセスでBotを運用できるようになる。CPUが余ってるから並列処理した方がもっと効率的に運用できるのにな〜、とか、サーバの増設、いわゆるスケールアウトがしたい、だとかが実現するよ。 詳しくはDIscord公式のドキュメントを読んでほしい。どのような基準でギルドを振り分けるのかも書いてある。 discordapp.com

シャーディングをする目安

discord.pyのドキュメントでは1000ギルドからと書いてあった。Rythmのエンジニアさんは2000ギルドを超えたならシャーディングした方がいいと言っていた。そんな感じで。

やり方

複数サーバで運用する場合

2台のサーバに1プロセスずつ走らせるとする。 Clientのインスタンス生成時に、何番目のプロセスなのか示す shard_id とプロセスの総数の shard_count を指定する。
サーバA

client = discord.Client(shard_id=0, shard_count=2)

サーバB

client = discord.Client(shard_id=1, shard_count=2)

shard_id は0から始まることに注意する。 あとはすべてのプロセスを立ち上げるだけで完了。

1つのサーバ上で複数プロセスを立ち上げたい場合

Client クラスの代わりに、 AutoShardedClient を使う。このクラスは、自動でいい感じにshardingしてくれるやつらしい。すごい。詳しくは公式のドキュメントを読んでほしい。

client = discord.AutoShardedClient()

これだけでOK。1000ギルドにつき1つプロセスを生やしてくれる。もし、生やしたいプロセス数があるならば、 shard_count を渡してやればそれだけ立ててくれる。

複数サーバで、それぞれ複数のプロセスを立てたい場合

AutoShardedClientshard_ids を渡す。
例えば、2台のサーバに4プロセスずつ、合計8プロセス生やす場合 サーバA

client = discord.AutoShardedClient(shard_count=8, shard_ids=(0, 1, 2, 3))

サーバB

client = discord.AutoShardedClient(shard_count=8, shard_ids=(4, 5, 6, 7))

どのサーバにどれだけプロセスを割り振るかは、スペックに応じて柔軟に臨機応変してほしい。

注意点

  • shard_count の数だけプロセスが立ち上がらないと、Botはオンライン扱いにならない
  • DMは、 shard_id が0のプロセスが受け取る

思うこと

それぞれ独立した複数のサーバで運用する場合は、1つでもプロセスが落ちたらBotが機能しなくなるので、その辺の工夫が必要になると思う。

オープンセミナー2018@香川に参加しました

参加しました。

osk.connpass.com

香川でIT系のカンファレンスはあんまりないのでとりあえず行くか!!みたいなノリで。
あと、尊敬してるそーだいさんも登壇するみたいだったので、レアな機会だなと。

セミナー自体は、ちょっと自分ではわからない内容もあったものの、ためになる話も結構ありました。エンジニアが会社を立ち上げてみて6年というお話は、様々な失敗談を挟みながらエンジニアらしく解決してきたという内容でした。社内システムを面白くするというのは斬新だなぁと思いました(小並感)。
失敗から学ぶ正しいRDBの歩き方は、以前お話を聞いた部分もありますが、当時の自分はDB全然わからんマンだったので、ちょっと触るようになった今はそれなりにこういう話なのかなあと噛み砕きながらお話を聞けました。とりあえず、お話を聞いて喋太郎のDBが汚いことがわかったので、お話を聞きながらissueを立てました。
f:id:pvvn3135:20190303211950p:plain 懇親会は色々お話を聞けたのですが、喋太郎の今後の展開で悩んでいた部分を相談できて、どうしたらいいか、ダメだった時どういう選択肢を取るべきか、みたいなアドバイスをいただけました。社会人のエンジニアさんに相談できる機会はたくさんないですし、めっちゃゴイスな人となるとなおさら...なんですよね。
またこういう機会があったら逃さずに参加したいと思います。

GMOペパボ株式会社のインターンに参加しました!!

どうも、だーやまんです。
昨年の9月にもう一度、GMOペパボ株式会社(以下ペパボ)のインターンシップに参加させていただいたので、そこで得たものを書いていこうと思います!以前も同じタイトルの記事を見た...?今回は東京本社編です!!!!
記事にするのめちゃめちゃ遅くなって大変申し訳ございません!!!!!!!!!!!!

続きを読む

ボイスロイド(風)のDiscord読み上げBotを作った(導入、使い方編)

さぶー。どうも、だーやまんです。あけましておめでとうございます。

さて、今回は開発したDiscord読み上げ(TTS)Bot 「喋太郎」を紹介します。
喋太郎は、4人のキャラクターによってテキストチャンネルに投稿されたメッセージをボイスチャンネルで読み上げるBotです。
デフォルトのコマンドプレフィックスは「?」ですが、変更可能です。

  • 結月ゆかり
  • 弦巻マキ
  • 月読アイ
  • 水奈瀬コウ

が利用できます。
追記 6/16
一時的に、これらのキャラクターの音声は利用できなくなっております。読み上げは、問題なく行えます。
詳しい話はいらんから導入させろって方は、以下のリンクを踏んで各自のサーバに導入してくださいな〜。

喋太郎招待リンク

サービス運営費のご支援お願いします!!
fantia.jp

Botの使い方

1. ボイスチャンネルに接続します。
f:id:pvvn3135:20190209120359p:plain
2. 「?summon」とテキストチャンネルに送信します。すると、喋太郎がボイスチャンネルに接続します。
f:id:pvvn3135:20190209120600p:plain
f:id:pvvn3135:20190209120617p:plain
3. あとは、召喚したテキストチャンネルに文を送信すると、喋太郎がそれを読み上げます。ちなみに、デフォルトの音声はゆかりさんです。
4. 使い終わったら、「?bye」で切断してください。
f:id:pvvn3135:20190209120927p:plain

コマンドの基本的な使い方

?help

各コマンドの使い方を表示します。

?summon

ボイスチャンネルに喋太郎を呼び出します。以後、このコマンドを打ち込んだテキストチャンネルに送信されたメッセージの読み上げを行います。

?bye

ボイスチャンネルに接続している喋太郎を切断します。使い終わったら、きちんと追い出しましょう。

?spk

読み上げキャラクターを変更します。読み上げキャラクターはユーザごとに保存されます。詳しくは後述。

?set_prefix

コマンドのプレフィックス(コマンドの先頭文字。ここでは「?」)を変更します。「?set_prefix $$」とすることで、プレフィックスが「$$」に変更されます。他のBotと競合する場合にご利用ください。

?stop

再生中の読み上げを停止します。長文を送信してしまい、長時間読み上げそうな時にご利用ください。

?wbook

読み仮名の登録や削除が行えます。詳しくは後述。

キャラクターの変更方法

?spk yukari

結月ゆかりに変更

?spk maki

弦巻マキに変更

?spk ai

月読アイに変更

?spk kou

水奈瀬コウ

辞書の使い方

?wbook add

「?wbook add 強敵 とも」と入力すると、それ以後、「我が強敵よ、それでも男か。」を「わがともよ、それでもおとこか。」と読み上げるようになります。

?wbook list

登録した単語と読み上げ、登録番号を一覧表示します。

?wbook del

「?wbook del 456」と入力すると、登録番号が456の単語を辞書から削除します。登録番号は、先述の?wbook listから確認できます。

おわりに

いいな、と思ったら是非是非こちらから導入してみてください!

何かあれば @gamerkohei か、GitHubissueまでよろしくお願いします。
ボイスロイドじゃなくて、ボイスロイド(風)な理由とか、技術的なお話などはまた今度書きます!
でわでわ〜

GMOペパボ株式会社のインターンに参加しました!!

どうもどうも。だーやまんです。

前回の記事の通り、GMOペパボ株式会社(以下ペパボ)のインターンシップに、ぐにくん(@guni1192)と共に参加してきました!
彼も記事を書いてるのでぜひ読んでやってください。
guni1192.hatenablog.com

先輩方が絶賛していたのは決して嘘ではないなと実感しました。
きっと大学では経験できない貴重な体験ができました。
その体験をかいつまんで書いていきたいと思います。

前日入りの様子





幸先不安ですね

インターンの内容

ロリポップ

お問い合わせ受付完了メールを配信する部分をPHPからRuby on Railsに切り替えるというもの。

ここで色々入力して、ロリポップへ送信すると自動で送られてくるメールの部分です。

RailsでMailerを作る

View,Controller,routingを手打ちで作り、RSpecでテストしました。
Railsは初心者、テストを書くこと自体初めて、という状態だったため、この部分のリリースに6日かかりました。
ちなみに、インターンで作業に使える期間は7日間です。残り1日は成果物発表。

PHPの部分の切り替え

メールを送信する処理をしていたメソッドを、RailsAPIを叩くように書きかえました。
こちらはPHPUnitを用いたテストを書いている途中でタイムアップでした。リリースならず。
一応、動くものはできたのですがエラー処理の部分が真っ白だったりするので、あと数日時間が欲しかったです。
というか、前の工程に時間がかかりすぎでした。

KPTA

インターンを振り返って、自分を見つめ直すことができた。
f:id:pvvn3135:20180223154212j:plain
こう、ぐにくんと比べて技術的な話が少ない気がしますね。

目標の達成

仕事としてのプログラミングを学ぶ

Success!!
テストを書く、つまりは不具合が極力起きないようにするということ。顧客に使ってもらうために、誠実に、責任を持ってコードを書くという姿勢を学ぶことができました。

もっとおもしろく

SoSo.
用意されたタスクをこなすのでいっぱいいっぱいで、moreができませんでした。ただ、もっと面白くするには基礎力がかなり必要だということがわかりました。当たり前だ。

得られたもの

ファンの増やし方

インターンに参加する前、私は面白いものを作れば、ファンは必然と増えるものと考えていました。ですが、先述の仕事に対して責任を持ち、誠実に向き合うという要素も、ファンを増やすということには大事な要素だと知ることができました。

体重

ご飯が美味しかったです。

これから

まずは自分の書きっぱなしのコードに対して真面目に向き合おうと思います(モナコインbotとか)。具体的にはテストを書いて不具合が起きないようにします。
次に何かしらサービスをどんどん作っていきたいなと!面白いものを、誠実にやっていきします!

インターンを完走した感想(激ウマギャグ)

参加して本当に良かったです!!
まずは挑戦させてくださること。わからないことは納得が行くまで説明してくださること。私の意見でも尊重してくださること。どれもが私の圧倒的成長に繋がったと思います!
また、社内のフランクな雰囲気や楽しい飲み会、ランチなど、自然に楽しくコミュニケーションが取れる環境はとても素晴らしいものだと感じました。

最後に、このような貴重な体験を与えてくださったペパボの皆様、本当にありがとうございました。
また、お会いできる日を楽しみにしております。

小話や、ぐにくんに任されたグルメレポートは次の記事でやります

 
 ブログバナーです  
 ご自由にお使いください

リンク先は
http://nonbiriyanonikki.hatenablog.com
でお願いします