Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby 服务间通信模式

Ruby 服务间通信模式

1. 共享数据库:共享数据和模型
2. 请求结果(同步)Http API & RPC
3. 请求任务处理(异步):消息队列
4. 订阅和通知:消息队列

Vincent Xie

March 30, 2015
Tweet

More Decks by Vincent Xie

Other Decks in Programming

Transcript

  1. ruby 应⽤用的演化 big app db app1 db app2 db app3

    db 微服务化(SOA化)是解决系统复杂度的⼀一种有效⽅方法
  2. 薄荷 app 的例⼦子 薄荷 账户 购物 状态 记录 消息 ⾷食物

    计划 按业务垂直划分,⾼高内聚、低耦合, 尽可能减少和简化服务间通信
  3. 服务间通信种类 • A 服务需要使⽤用 B 服务的⼀一些数据 》 共享数据库 • A

    服务需要 B 服务提供某个计算结果 》 请求结果 • A 服务需要 B 服务处理⼀一项任务 》 请求任务处理 • A 服务发⽣生某件事,通知 B 和 C 进⾏行处理 》 订阅和通知
  4. Http API 注意事项 • Http Client 选择 • 依赖,性能和并⾏行处理 •

    访问安全控制,使⽤用 ip限制,token校 验等 • 避免调⽤用层次过深,超时机制
  5. 并⾏行 http request require  'typhoeus'   require  'typhoeus/adapters/faraday'   response1,

     response2  =  nil   conn  =  Faraday.new(:url  =>  "http://coolness.com")  do  |faraday|      faraday.adapter  :typhoeus   end   conn.in_parallel  do      response1  =  conn.get('/one')      response2  =  conn.get('/two')      #  these  will  return  nil  here  since  the      #  requests  haven't  been  completed      response1.body      response2.body   end net/http, excon, parton and more typhoeus 基于 libcurl,性能⾼高,⽀支持并⾏行请求
  6. 消息队列 • 传统消息队列系统 • Rabbit MQ / Active MQ …

    • 基于 redis 的轻量消息队列 • resque & sidekiq • sidekiq-postman app1 app2 MQ
  7. sidekiq-postman 核⼼心代码            #  deliver  job

                 def  deliver(worker,  arguments,  options={})                  msg  =  {  'class'  =>  worker,                                    'args'  =>  arguments,                                    'jid'  =>  SecureRandom.hex(12),                                    'retry'  =>  options[:retry]  ||  true,                                    'enqueued_at'  =>  Time.now.to_f                  }                  redis_connection.lpush("#{@namespace}:queue:default",  JSON.dump(msg))              end   Sidekiq::Postman.deliver("rd",  
    "PushHisWeightsToQqWorker",  [user.user_key])  
  8. sidekiq-driver app1 app2 app3 driver publish consume consume subscribe subscribe

    ⼀一种基于sidekiq 轻量订阅和通知解决⽅方法,
 简单实⽤用,我个⼈人正在写的 gem,即将开源
  9. Thank you & QA • ruby-china: vincent • mail: [email protected]

    • http://xiewenwei.github.com • 微信:booheeok
  10. 参考链接 • www.slideshare.net/HiroshiNakamura/rubyhttp-clients-comparison • https://thrift.apache.org/ • https://github.com/msgpack-rpc/msgpack-rpc • https://github.com/jondot/sneakers •

    https://github.com/gocardless/hutch • https://github.com/rack-amqp/rack-amqp • http://codeincomplete.com/posts/2014/9/4/introducing_rackrabbit/