• “谁让你们用 Ruby?这语言就是慢,我一个自动化专业都懂这个道理。”

    自动化专业,11 年 + ruby 路过。

  • 面 ruby,给套 c++ 的题,做完,然后开面,才发现是面 ruby 的,有木有同样遭遇的?

  • 通常招聘贴,都要晒妹纸,敢问贵司单身妹纸可有?

  • 不知道是不是你想要的结果

    `xxx` 命令行执行的结果貌似没有 nil,顶多是空字符串''

    没有测试环境,所以没法一一验证代码的准确性。

    `/bin/stty size 2>/dev/null`.split.yield_self { |_, width|
      width || `/usr/bin/tput cols 2>/dev/null`.split[0] || 80
    }.to_i
    

    另:xx.yield_self 仅限 Ruby 2.5.0 以上

  • 喔,懂了,可能设计思路不太相同。

    其实你已经有了数据库的持久化形式了,在 job 的运行过程中,也对整个流程做了步进日志的记录,你可以不用再去访问 job 的状态,前端展示只需要轮询持久化之后的结果就可以了。

  • Sidekiq 的 API 通过 job_id 寻找这个 job 是非常低效的, 这在前文已经说过

    我不是很明白,为什么会有通过一个 jid 去寻找 job 的需求

    each_slice 多核问题

    是不是可以考虑将 50 万数据,each_slice 成 50 份或者是 100 份,enqueue 至 sidekiq,然后利用多进程 sidekiq 来跑多核,我并没有要将 50 万数据扔一个 job 里面跑的意思。我指是的你可以用 each_slice 来将数据分片,然后批量创建 job。

    job_id 生成是有成本的

    跟第 3 一样,既然明知是一个很耗时的方法,我们何必非要让 push_bulk(items) 一次跑 10 万个,我们将数据切片打散成多个 job 也是可以的。

  • 1、sidekiq 平民版支持一次批量插入成千上万的 job,可以用 Sidekiq::Client.push_bulk(items) 这个方法来生成待执行的任务;源码和注释见: https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/client.rb#L135 https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/client.rb#L92

    这个方法同样也返回了所有生成 job 的 jid,效率如何需要自测。

    2、关于失败 job 的提示信息记录或者是执行过程全记录,可用第 1 步生成的 jid 数组来自由发挥,选择适合自身项目的一种即可。 方法有很多种,比如照原来的方式存 mysql,步步更新。

    3、对于需求 3. 批量导出 50 万大促信息,ruby 本身即有一个对大数据的分批方法: each_slice,文档见: http://ruby-doc.org/core-2.5.1/Enumerable.html#method-i-each_slice

    可将这 50 万,按 10_000 或者更多分为一批,做一些简单拼凑然后导出,降低数据库或其他数据源的查询压力,最后将结果拼装成一个 excel 或者是你们想要的其他的数据导出格式即可。

    临时想到的一些平时用过的方式,也不知道是否符合你们项目的胃口,有说得不恰当的地方请不要笑话。

  • 容我先细细看下你们的思路先^_^

  • 对 sidekiq 的研究还是比较深入,这一点不可否认,点 N 个赞。

    过一年再来回头来看今天你们这个设计,可能会发现其实还可以走另外的设计方式。具体怎么设计,我并没有细看,所以不发表意见。

  • 拖家带口不容易呀,我其实也想放飞自我,出川看看祖国的大好河山。

Ruby@ChengDu