• 写了一个 Libra 的客户端库 at 2019年10月23日

    最后更新是 4 年前,和最新的 sha3 标准不兼容。

  • 吐槽一下 PostgREST 的查询语法设计:

    1. 查询字段没有独立的名称空间,所以它的 limit/order/select 等关键字会和要查询的字段名冲突
    2. 查询类型没有独立的名称空间,查询类型和查询内容混合,比如 age=eq.13, 这里 eq 和 13 分别是查询类型和查询内容,所以 PostgREST 难以支持 or 查询
    3. 不支持单个对象的获取
    4. 支持按搜索条件批量删除,容易误操作
  • 目前 kaola 支持的 and/or 嵌套查询是这种的 比如

    s:{
        'f1,f2':v1,
        'f3':v2
    }
    

    表示 (f1=v1 or f2=v1) and (f3=v2), and/or 逻辑都是隐含的。如果要最外层用 or,也许更方便的是调用两次 api?

  • 实现不难,关键是要有一个好的查询表达规范,符合前端程序员的直觉。你能用嵌套的 json 合理表达出你的需求,就可以实现这个功能。说实话,我认为 PostgREST 的查询语法很丑陋。

  • 在目前几个内部项目中,kaola 都是配合其它 api 一起使用的。比如老白的供应链系统,需要对接京东/网易/顺丰等外部接口,这部分是一个独立部署的项目。

    所以 url 鉴权是在更高一层的网关实现的,基于 Netflix/zuul。而细粒度的权限控制,则每个项目都是自行实现的。

  • 权限确实是个麻烦的东西。 看了 PostgREST,它是直接利用数据库的角色进行权限控制,太死板。 目前还在构思一个优雅的内置解决方案。

  • 谢谢提醒,kaola 2016 技术分享 链接已修复

  • 测试的时候,mysql 和 oracle 都试过,没问题。其它 rails 支持的数据库,使用 kaola 应该问题也不大。 生产环境目前都是 mysql 数据库

  • 去年开始写 kaola 的时候还真不知道 PostgREST,看来也是一种趋势。 不过用 rails 实现的好处是多种数据库都支持。

  • RubyConf China 2015 资源汇总 at 2015年10月12日

    👍

  • RubyConf China 2015 赞助征集 at 2015年07月07日

    赞!期待...

  • #8 楼 @nameofhsw Celluloid 是基于 fiber 的 actor 编程模型,方便写高并发的程序

  • EventMachine 已经好久没更新了,建议看看 Celluloid

  • Puma 源代码分析 - IO 处理 at 2015年04月24日

    #5 楼 @ibachue 很牛!

  • Puma 源代码分析 - IO 处理 at 2015年04月20日

    #2 楼 @ibachue 是啊,我也碰到这个问题,通过写 cron 脚本定时删除解决。你提醒我,这个问题其实不应该存在的。看了 puma 的实现,用的是 Tmpfile 写临时文件,这个文件在垃圾回收的时候/或者进程退出的时候会自动删除了。然后看了 unicron 的实现,发现它自己实现了临时文件。照 unicorn 的说法,这是一些 ruby 的实现的 bug。

  • 好,支持,威武,有希望了!

  • Ruby China 要有小弟妹啦 at 2015年03月30日

    #1 楼 @huacnlee #2 楼 @xiaogui 是的,我们需要一个类似 Ruby China 的 Go China 社区。

  • Puma 源代码分析 - 完结篇 at 2015年03月26日

    #2 楼 @est 第一次听说 Einhorn,看了一下,应该是一个 ruby 写的父子进程 socket 管理器,相当于把 unicorn 和 puma cluster 的父子进程管理部分独立出来。这样可以在 Einhorn 后面挂其它的 web server,提供了架构的灵活性。

  • Unicorn 里创建线程 at 2015年03月25日

    #2 楼 @ming_relax 如果想做到 “想根据 redis 消息清掉当前 web process 里的某一块数据结构”, 那么这个数据结构为什么不放在 redis 里。

  • 技术上看有点意思,不过现在都搞 app 开发了,win32 桌面程序没什么吸引力啦

  • #1 楼 @flowerwrong 看一些 gem 的源代码,要有目的性。我一般不会为了读源代码而读源代码。比如在使用 gem 的过程中碰到了 bug,那么会追踪到 gem 的源码中去。这个时候因为带着目的,就会有主线,不会因为很多方法跳来跳去而迷茫了。至于调试,和普通的代码调试一样啊。至于查找源代码的关键点,有一些小方法,一个是用 grep/ack 等搜索关键字,还有就是 ruby 提供的 source_location 方法,在查找第三方 gem 的某个方法的实现时很有用。比如想要知道 rails 里面 1.days.ago 是怎么实现的,可以执行 1.method(:days).source_location,就可以知道实现的代码在哪里了。 ["/mnt/.rvm/gems/ruby-2.1.2/gems/activesupport-4.0.9/lib/active_support/core_ext/numeric/time.rb", 49]

    def days ActiveSupport::Duration.new(self * 24.hours, [[:days, self]]) end

  • #5 楼 @est 是的,fork 的时候子进程直接继承了父进程打开的网络端口。比如 puma 运行在 9291 端口,运行 lsof -i :9291 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 10634 lian 7u IPv4 1521102 0t0 TCP *:9291 (LISTEN) ruby 10637 lian 7u IPv4 1521102 0t0 TCP *:9291 (LISTEN) ruby 10639 lian 7u IPv4 1521102 0t0 TCP *:9291 (LISTEN) 可以看到 3 个进程都打开了这个端口。

  • #2 楼 @est 所有的 web 请求都是直接 worker 处理,pipe 间只是每 5 秒同步一次状态,不涉及到性能问题。

  • #1 楼 @flowerwrong Web 集群的搭建都还算简单的吧。接入层自己搭 LVS 或者用云服务如阿里云的 SLB,然后 web 服务器有几个核就给 puma 配几个 worker,web 服务器本身无状态,使用集中式的后端存储 memcache/redis/mysql 保存状态,整个 web 集群就搭建起来了。

  • #7 楼 @jsvisa 是的,听说过 ack,应该更好用。可能我 grep 用久了,没想过换其它的。