[DAY21] 非同步的 Boxenn Use Case

在实务中,常常会有花很长执行时间、或需要排程的逻辑,这时候便会需要进行非同步处理。

在 Boxenn Use Case 上扩充 sidekiq worker

sidekiq worker 的介面需要 perform 这个 method,而对於 Boxenn::UseCase 来说,他原本对外就只有 call 这个 public method,因此扩充的方法很简单,只需要额外定义 perform 让他呼叫 call 就可以了。

module Worker
  def self.included(base)
    base.send(:include, Sidekiq::Worker)
  end

  def perform(*params)
    result = if params.empty?
               call
             else
               call(serialize(*params))
             end
    return if result.success?

		# error handle
    message = Array(result.failure).map(&:to_s).join(', ')
    Rollbar.error(message, trace: result.trace)
    raise StandardError, message
  end

  private

  def serialize(params)
    params.transform_keys(&:to_sym)
  end
end

使用方法

只需要在原本的 Use Case 多 include 上面所写的 Worker 就可以使用了。

class YourWorker < Boxenn::UseCase # inherit Boxenn::Usecase
  include Worker # include Worker for asynchronize purpose
	sidekiq_options queue: :default # setting sidekiq options

  def steps(params1:, params2:)
    result = action1(params1: params1, params2: params2)
    Success(result)
  end

  private

  def action1(params1:, params2:)
    # DO SOMETHING
  end
end

# calling use case asynchronize
YourWorker.perform_async(params1: params1, params2: params2)

# calling use case synchronous
YourWorker.new.call(params1: params1, params2: params2)

sidekiq options

Sidekiq Best Practice

  • 参数尽量传简单的 identifier (原生 ruby type),而不是整个 object。

    Sidekiq 会把参数会先转为 json 存进 redis,等到要执行时再序列化为 ruby object,因此如果原本的参数不是原生型态,不但需要更多时间序列化,甚至有可能出现序列化错误的问题。

    # BAD
    user = User.find(user_id)
    SomeWorker.perform_async(user)
    
    # GOOD
    SomeWorker.perform_async(user_id)
    
  • 用 perform_async 代替 delay extension,delay extension 主要缺点有两个:

    1. 传的参数太复杂时有可能造成 redis timeout,因为 sidekiq 是用 yml 来序列化参数,传太复杂的 ruby object 会让 payload 很大。
    2. 会在 class 上额外加 method。

下一篇会介绍如何对 Boxenn::UseCase 进行测试。


<<:  Day22 jQuery 基本教学(二)

>>:  [进阶指南] 错误边界 ( Day22 )

【Day 29】Matplotlib 介绍

前言 Matplotlib 是一个把数据可视化的套件,他可以和 NumPy 一起连用,与 Matla...

Kotlin Android 第28天,从 0 到 ML - TensorFlow Lite -姿态估计 (Pose estimation)

前言: 常常看到特效电影幕後花絮,都有请演员在绿幕前在录动作身上都有点点,在萤幕上变成火材人,姿态估...

[Day 22] 实作 - 介面篇6

开始在主场景下做出一个类似技能快捷键的视窗 从Spriteset_Map开始 在ActionBatt...

Day 11 - 除了写程序之外还要访谈厂商之体验

昨天的文章有提到计画案有部分的厂商是需要去挖掘的,也因此今天会来分享一个计画案出现前与厂商面谈的心得...

IT 铁人赛 k8s 入门30天 -- day21 k8s Task Deploying PHP Guestbook application with Redis

前言 今天这个章节将要来实作 Deploying PHP Guestbook application...