当前位置: 首页 > 资讯 >

[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 进行测试。


相关文章:

  • [Day 29] 资源应有尽有的Proofpoint
  • 系统分析师的养成之路—聆听篇
  • Node.js安装
  • 下载Python
  • Day6-TypeScript(TS)基础型别资料Part 1
  • Debian系统解决中文乱码
  • [浅谈]-NoSQL资料库怎麽选?
  • DAY09 - [CSS] 页签 与 其他小事
  • JavaScript - 做个录音录影功能ㄅ
  • 运动控制
  • Day 03 - 行前说明 — 在 MVC & MVVM 的 UI 元件
  • 卡夫卡的藏书阁【Book6】- Kafka 实作新增 Topic
  • 【Laravel】 MVC 与 专案结构
  • Vue.js 从零开始:emit 元件的沟通
  • Day 02 注册 Azure 帐号与套件安装- 免费体验30天
  • WordPress 5.7 的 Robots API 和 max-image-preview 指令
  • 海外营销周报:谷歌在搜索中取消Q&A功能,FaceBook Marketplace用户总量达 10 亿人 – 知外贸
  • 一键脚本:Aria2+Aria2Ng+OneIndex | 自动上传OneDrive
  • Jungle Scout选品工具中文版好用吗?亚马逊选品为什么要用JungleScout
  • 教程:阿里云国际版绑定香港PayPal购买方法
  • Monzo Bank教程:英国银行卡申请教程【教你国内注册申请欧洲银行卡】
  • 最便宜的国外VPS推荐:5美金以下的VPS大全
  • 苹果手机Apple美国区账号无信用卡购买教程【Apple ID美国区绑定PayPal教程】
  • DGCHOST稳定吗?现在还可以购买DGCHOST的服务器VPS吗
  • WordPress 5.7 引入新钩子,用于过滤单个区块的内容
  • WordPress禁用古腾堡编辑器全屏模式
  • WordPress主题怎么安装?WordPress主题模板安装失败怎么解决
  • WordPress主题开发基础:Body 类指南
  • 如何在Hositnger主机开启Cloudflare服务,Hositnger主机Cloudflare CDN使用教程
  • VPS优惠:搬瓦工香港VPS补货/G口/KVM/月付9.9美元