http://www.flickr.com/photos/free-stock/6837290750/
自己紹介

                       染田貴志 (SOMEDA Takashi)

               http://d.hatena.ne.jp/tksmd

                株式会社ヌーラボ所属

               Backlog の開発・インフラ・サポート
                Cacoo のインフラ

               FxUG 京都スタッフ
               JAWS UG 京都支部長
               関西 Java エンジニアの会 常連


       kanjava vol.8
1年ぶり4度目の登板
  http://d.hatena.ne.jp/tksmd/20100929




                                                          https://cacoo.com/diagrams/zIPOGa9u3sP8NHHf




   http://d.hatena.ne.jp/tksmd/20110720




                                          kanjava vol.8
MessagePack RPC

ご存知の方


   kanjava vol.8
この本読んだ方




  http://www.amazon.co.jp/Java並行処理プログラミング-―その「基盤」と「最新API」を究める―-Brian-Goetz/dp/4797337206

                               kanjava vol.8
今日 ”お話しない” こと



     非同期処理について




      並行処理について


          kanjava vol.8
Agenda



                背景
         MessagePack RPC とは
         使ってみた / 拡張してみた
               まとめ


                                http://www.flickr.com/photos/rickerbh/449823989/

                kanjava vol.8
背景




     http://www.flickr.com/photos/nicmcphee/2558167768/
実現したい事




 Git リポジトリ
    の情報を
 アプリ側で表示



             kanjava vol.8
課題


     Git リポジトリとアプリサーバは別にしたい




        実行速度はなるべく速くしたい




        言語非依存でやり取りしたい




              kanjava vol.8
アーキテクチャ




          kanjava vol.8
MessagePack RPC とは




       http://www.flickr.com/photos/83633410@N07/7658034524/in/photostream/
RPC (Remote Procedure Call)

                                メソッド呼び出し




    処理結果



                kanjava vol.8
ちっちゃくて、速い JSON
 http://wiki.msgpack.org/display/MSGPACK/Design+of+Serialization




                                http://www.rubyinside.com/messagepack-binary-object-serialization-3150.html
                                          kanjava vol.8
ドラクエX でも!




        http://gigazine.net/news/20120824-dragonquest-backstage-cedec2012/
            kanjava vol.8
非同期 RPC




                  http://wiki.msgpack.org/display/MSGPACK/Design+of+RPC
          kanjava vol.8
パイプライン




                 http://wiki.msgpack.org/display/MSGPACK/Design+of+RPC
         kanjava vol.8
実装が沢山




                        http://msgpack.org/
        kanjava vol.8
使ってみる / 拡張してみた




     http://www.flickr.com/photos/83633410@N07/7658268052/in/photostream/
使ってみる




  https://github.com/tksmd/kanjava08-sample




                   kanjava vol.8
基本的な役割はこれだけ


                        クライアント




                        処理の実装




                         サーバ




        kanjava vol.8
非同期呼び出し


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
実装とインターフェースは違って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
ハンドラの 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
拡張してみた




                画像ファイルなど
          byte[] をそのまま送信すると
                   色々大変




         kanjava vol.8
Netty 的な話




            kanjava vol.8
泥臭い




                      ここで横取り




      kanjava vol.8
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
まとめ




      http://www.flickr.com/photos/nauright/2662160957/
非同期処理は難しい?!


    非同期処理を意識する所はほとんどない




     手軽に複数サーバでの
     分散処理が記述できる


           kanjava vol.8
今後の課題など


      他言語からのアクセス




     パフォーマンス的なところ




       冗長化的なところ




          kanjava vol.8
気になる




                       https://twitter.com/frsyuki/status/239951922478596096
       kanjava vol.8
まもなく!




        kanjava vol.8
Thanks!!




    ありがとうございました
           ご質問あればどうぞ!




               kanjava vol.8

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