MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月

4,955 views

Published on

Published in: Technology

MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月

  1. 1. http://www.flickr.com/photos/free-stock/6837290750/
  2. 2. 自己紹介 染田貴志 (SOMEDA Takashi) http://d.hatena.ne.jp/tksmd 株式会社ヌーラボ所属 Backlog の開発・インフラ・サポート Cacoo のインフラ FxUG 京都スタッフ JAWS UG 京都支部長 関西 Java エンジニアの会 常連 kanjava vol.8
  3. 3. 1年ぶり4度目の登板 http://d.hatena.ne.jp/tksmd/20100929 https://cacoo.com/diagrams/zIPOGa9u3sP8NHHf http://d.hatena.ne.jp/tksmd/20110720 kanjava vol.8
  4. 4. MessagePack RPCご存知の方 kanjava vol.8
  5. 5. この本読んだ方 http://www.amazon.co.jp/Java並行処理プログラミング-―その「基盤」と「最新API」を究める―-Brian-Goetz/dp/4797337206 kanjava vol.8
  6. 6. 今日 ”お話しない” こと 非同期処理について 並行処理について kanjava vol.8
  7. 7. Agenda 背景 MessagePack RPC とは 使ってみた / 拡張してみた まとめ http://www.flickr.com/photos/rickerbh/449823989/ kanjava vol.8
  8. 8. 背景 http://www.flickr.com/photos/nicmcphee/2558167768/
  9. 9. 実現したい事 Git リポジトリ の情報を アプリ側で表示 kanjava vol.8
  10. 10. 課題 Git リポジトリとアプリサーバは別にしたい 実行速度はなるべく速くしたい 言語非依存でやり取りしたい kanjava vol.8
  11. 11. アーキテクチャ kanjava vol.8
  12. 12. MessagePack RPC とは http://www.flickr.com/photos/83633410@N07/7658034524/in/photostream/
  13. 13. RPC (Remote Procedure Call) メソッド呼び出し 処理結果 kanjava vol.8
  14. 14. ちっちゃくて、速い JSON http://wiki.msgpack.org/display/MSGPACK/Design+of+Serialization http://www.rubyinside.com/messagepack-binary-object-serialization-3150.html kanjava vol.8
  15. 15. ドラクエX でも! http://gigazine.net/news/20120824-dragonquest-backstage-cedec2012/ kanjava vol.8
  16. 16. 非同期 RPC http://wiki.msgpack.org/display/MSGPACK/Design+of+RPC kanjava vol.8
  17. 17. パイプライン http://wiki.msgpack.org/display/MSGPACK/Design+of+RPC kanjava vol.8
  18. 18. 実装が沢山 http://msgpack.org/ kanjava vol.8
  19. 19. 使ってみる / 拡張してみた http://www.flickr.com/photos/83633410@N07/7658268052/in/photostream/
  20. 20. 使ってみる https://github.com/tksmd/kanjava08-sample kanjava vol.8
  21. 21. 基本的な役割はこれだけ クライアント 処理の実装 サーバ kanjava vol.8
  22. 22. 非同期呼び出しpackage kanjava.msgpack.async;import org.msgpack.rpc.Future;public interface RPCAsyncHandler { // heavy が呼ばれる public Future<String> heavyAsync(); // light が呼ばれる public Future<String> lightAsync();} kanjava vol.8
  23. 23. 実装とインターフェースは違ってok @Test public void インターフェースと実装は違っていてもよい() throws Exception{ EventLoop loop = EventLoop.start(); Server server = new Server(loop); server.serve(new TestHandler()); server.listen(8969); Client client = new Client("127.0.0.1", 8969, loop); TestInterface handler = client.proxy(TestInterface.class); String actual = handler.method(); assertThat(actual, is("ok")); } kanjava vol.8
  24. 24. ハンドラの public メソッドには注意 @Test public void publicメソッドには注意してね() throws Exception { EventLoop loop = EventLoop.start(); Server server = new Server(loop); try { server.serve(new ExecptionHandler()); } catch (MessageTypeException e) { assertTrue("setDelegate を RPC メソッドとして登録しようとする", true); } finally { server.close(); loop.shutdown(); } } kanjava vol.8
  25. 25. 拡張してみた 画像ファイルなど byte[] をそのまま送信すると 色々大変 kanjava vol.8
  26. 26. Netty 的な話 kanjava vol.8
  27. 27. 泥臭い ここで横取り kanjava vol.8
  28. 28. Chunk 書き込み final InputStream is = handler.getStream(); channel.write(CustomMessage.startMessage(msgid, key)); ChannelFuture writeFuture = channel.write(new ChunkedStream(is)); writeFuture.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { future.getChannel().write(CustomMessage.endMessage(msgid,key)); is.close(); } }); kanjava vol.8
  29. 29. まとめ http://www.flickr.com/photos/nauright/2662160957/
  30. 30. 非同期処理は難しい?! 非同期処理を意識する所はほとんどない 手軽に複数サーバでの 分散処理が記述できる kanjava vol.8
  31. 31. 今後の課題など 他言語からのアクセス パフォーマンス的なところ 冗長化的なところ kanjava vol.8
  32. 32. 気になる https://twitter.com/frsyuki/status/239951922478596096 kanjava vol.8
  33. 33. まもなく! kanjava vol.8
  34. 34. Thanks!! ありがとうございました ご質問あればどうぞ! kanjava vol.8

×