👍
昨天镜像 build 炸了 就是因为这个
我宁愿迁移 crystal
6

是的,没有实现 worker,但我现在的用法是和 sidekiq 一起,利用 sidekiq 的 worker 来实现,可以看上面新提交的代码
if Sidekiq.server?
  Sidekiq.on(:startup) do
    BQ = BufferQueue.new(max_batch_size: 10, execution_interval: 100) do |batch|
      puts "bulk insert #{batch.size} records"
      Hyper::Event.import(
        EventJob::COLUMN_NAMES,
        batch.flatten.map { |attr| Hyper::Event.new(attr) },
        validate: false,
        timestamps: false
      ) unless batch.empty?
    end
  end
end
in sidekiq job:
class EventJob
  include Sidekiq::Worker
  COLUMN_NAMES = Hyper::Event.column_names
  def perform(*args)
      result = a_lot_of_cal
      BQ.push result
    end
  end
end
效果就是先利用 sidekiq 的多线程并行处理一些计算任务,产生的结果批量插入数据库; 相比之前 sidekiq job 里单条插入会快很多。并且可以利用 activerecord import 把多条记录改成 insert into values 的形式,插入更快。
ruby 的内置 queue 不太好用:https://bugs.ruby-lang.org/issues/9145
效果
[1] pry(main)> bq = BufferQueue.new(max_batch_size: 10, execution_interval: 5) do |batch|
  p batch
end
25.times do |i|
  bq.push(i)
end
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
=> 25
[2] pry(main)> [20, 21, 22, 23, 24]
[2] pry(main)> quit
shutdown ...
        搞了一个简单版 https://github.com/HyperCable/hypercable/pull/49/files
# frozen_string_literal: true
class BufferQueue
  attr_reader :max_batch_size, :execution_interval, :timeout_interval, :callback
  def initialize(max_batch_size: 100, execution_interval: 60, timeout_interval: 60, &callback)
    @max_batch_size = max_batch_size
    @execution_interval = execution_interval
    @timeout_interval = timeout_interval
    @queue = Queue.new
    @timer = Concurrent::TimerTask.new(execution_interval: execution_interval, timeout_interval: timeout_interval) do
      flush
    end
    @timer.execute
    @callback = callback
    at_exit { shutdown }
  end
  def flush
    batch = []
    max_batch_size.times do
      if not @queue.empty?
        begin
          batch << @queue.pop(true)
        rescue ThreadError
          puts "queue is empty"
          break
        end
      else
        break
      end
    end
    callback.call(batch) unless batch.empty?
  end
  def push(item)
    @queue << item
    if @queue.size >= max_batch_size
      flush
    end
    item
  end
  def shutdown
    puts "shutdown ..."
    @timer.shutdown
    flush
  end
end
        这种帖子底下需要一个 warning 功能
看起来不错
那个是用的 client middleware,要用的话,我要改成 server middleware。不一定基于 sidekiq,感觉 Ractor 可以做这东西。
 
相似度很高
可以把爬虫也替换了 https://github.com/pramsey/pgsql-http : 
居然还有人在

还没 production ready 就被官方发现了
sdk 都是可以得到源码的,但经过混淆了。
也不需要开源,目前 hypercable analytics 的使用方式:
<script async src="https://www.googletagmanager.com/gtag/js?id=G-PJBVFLBFSB"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-PJBVFLBFSB', {transport_url: 'https://learnsql.io/c7f4edce-58c3-4917-8f18-a2ea6c1b93dc'});
</script>
        
新建的 ga 都是 google Analytic v4 的;
是 数据自有的需求很大 有了这些行为数据之后,做 crm 广告系统 推荐系统 也就很容易了
还有一个计划 就是 saas 版也可以直接暴露一个只读的数据库链接,直接使用或拉取原始数据到自己服务器。私有部署版当然就更灵活了
会的 该有的都可以有 只是目前需要做的太多了
目前好多 broken link,下个版本一起修。。
[email protected] 111111
还有很多更酷的特性等待发布
。。。
admin 里
👌