• ShowMeBug 核心技术内幕 at 2019年10月30日

    @WalkPhoneGo 功能、性能、可靠性,这些是不同的东西?为啥跟你讨论可靠性,你为什么非要说功能和性能呢?

    至于为什么,不好意思我没研究过。

    其实挺期待你说说原因的。

    那按照你的逻辑,我试着回复一下哈。

    1 无脑堆机器 不行

    大量用户 是多少 稍微多一点人 AC 就是一具尸体了

    没事

    这个不是框架能保证的 需要自己实现

    1、2、4、6 都是功能,需要自己实现。

  • ShowMeBug 核心技术内幕 at 2019年10月30日

    如果这么理解可靠性,也不是不可以。

    关于这个模块,我说下我理解的可靠性吧。

    坦白的讲,我不是很介意性能差一点,但 AC 似乎是很不怎么好。更在乎这个模块可不可以横向扩展。能横向能扩展,就可以无脑堆机器。

    再就是,在一些奇奇怪怪的场景下,这个服务还可以健康的活着。比如大量用户重连的情况下、流量激增、一台机器突然挂掉,剩下的节点是不是能正常工作。

    以及,用户断连到重连,这段时间内的消息,要怎么处理(有单独服务处理会更好)。能不能确认消息已经传到客户端有单独服务处理会更好)。再复杂一点,有序。

  • ShowMeBug 核心技术内幕 at 2019年10月30日

    是一台物理机,记得没错是 120g 的内存。

    但这个是性能吧?还看过 go 可以几个 G 百万并发。。。

    虽然 go 性能看起来更好,但 erlang 在这个场景更合适。

    因为 erlang 有抢占式调度,go 没有。erlang 有并发模型,go 的 channel 相对来讲太简单了。很多东西做不了,或者不好做。

    我问的不是 phoenix 性能好不好好,也不是想跟你讨论,phoenix 和 rails 相比,哪个好。

    我就是想问。

    1. 可靠性指的是什么?
    2. phoenix 怎么保证的?

    我理解,你回答的 1、2、4、6 都是功能的问题。 3、5 是性能的问题。

    大体上(看起来都没问题,不过没仔细看),暂时都同意你的说法。

    最后再强调下

    1. 我不想跟你讨论哪个更好的这个问题。 我更好奇的是,背后的原因是什么?就是
    2. 可靠性具体指的是什么?
    3. 既然你说,phoenix 更可好,那 phoenix 怎么做到的?
  • ShowMeBug 核心技术内幕 at 2019年10月30日

    从服务端,发出去的消息,客户端一定能收到。

    这个 phoenix 是怎么做到的?还是说,可靠性不考虑这一点?

  • ShowMeBug 核心技术内幕 at 2019年10月30日

    @WalkPhoneGo @lyfi2003

    可靠性 具体指的什么?

    要是说,从服务端,发出去的消息,客户端一定能收到。这个 phoenix 也做不到吧?这个应该考回执来做?

    @WalkPhoneGo 求具体介绍下。

  • 怎么样让某个客户端的多次请求 让一个线程内处理 用 nio,nio https://ruby-china.org/topics/38404 或者看 AnctionCable 的源码。

  • client.puts resp + headers

    puts 应该事加 "\n",导致 length 是错的,客户端发了 close 帧,服务端还要再写一次,就报 broken 那个错了。

    具体的楼主还是用 tcpdump 看一下。

    curl 也能重现。

  • 主要 mnesia 是 Erlang 自带的,不过大家对 mnesia 都不熟,这个东西学习成本还不低。。。

    类似的产品有多。同样是 Erlang 实现,倒是 RabbitMQ 很有市场。

    除了特殊场景,性能一般不会是瓶颈。。。

  • 我打脸了,本地(4 core)测了一下,mnesia 本地压测。和 redis 速度差不多。。。只是快了几倍。。。

    除非 cpu 核心数特别多,或者几点特别多(也可能有问题),或者不需要好正一致性的情况,mnesia 在性能上才会有明显的优势。。。

  • 哈,redis 竟然有多线程的版本了。

    不过感觉 mnesia 应该会更快。因为 mnesia 是跑在应用里,本地读写,不用走网络,不用序列化,反序列化。 ets 的 hashtable 本神是可以被并发(不过这个并发数也不是很大)写不同 的 key 的,KeyDB 似乎是用 spinlock 锁了 table。

    性能最重要的要看 lock 和 transaction 咋实现的。

    Transactions hold the lock for the duration of the EXEC command. Modules work in concert with the GIL which is only acquired when all server threads are paused. This maintains the atomicity guarantees modules expect.

    KeyDB 有👆这么一句,不过没看懂。。。代码扫了眼,也没看懂。。。

  • Elixir 的话,可以用 Mnesia 存,速度快,分布式,健壮,ACID。mnesia 的缺点是和 app 共享内存。

    不过 Elixir 社区似乎不怎么待见 mnesia。

    理论上 mnesia 要比 redis 快很多(有人比较过 ets,ets versus redis benchmarks for a simple key value store)。

    redis 再怎么说也是单线程。。。

    补充

    本地实际压了一下,4 core,mnesia 只比 redis 快了几倍,性能优势不明显。

    用 dirty_read,性能会有上百倍的提升,但这样就没有一致性了。

    另外 redis 有社区版,支持多线程,https://ruby-china.org/topics/39083#reply-357150

  • 啥叫闭门会议?

  • redis 配置一下,可以存到磁盘里

  • Ruby 回调机制解释 at 2019年10月15日

    nodejs 的回调机制可以让 node 处理高并发而不占用大量资源

    不是回调机制,是异步 I/O 机制。Ruby 也有回调机制,和 node 是类似。node 单线程,ruby 全局锁。因为要 thread safe(避免一段代码被两个线程同时执行)。

    ActionCable,用一个线程跑了一个 event loop,ActionCable 里的 ws 操作,都是异步 I/O 操作。用 select 监听。ready 了调用对应的 callback(异步 io 使用 nio4r 做的)。

    理论上,性能(实际上似乎不是?没压过)应该和 nodejs 差不多。

    不过 midori https://github.com/midori-rb/midori.rb 的实现方式和 AnyCable 差不多,性能就和 nodejs 就几乎一样。

    Ruby 不是单线程,但是有全局锁。

    多线程可以很大程度解决 I/O 问题。但线程开销太大,如果需要更好的性能的话,还是需要绿色线程来做。

    最后,夹带点私货,线程和 nio 的比较,可以看看这个 https://ruby-china.org/topics/38404 (写的不怎么样,可以将就看看。。。)

  • 哦,18 年了。我不是作者,改不了。。。

    @u1352538039

  • 伯克利有门课用的是 RoR,cs169。

    MIT 出了 Julia,但一直没火起来。

  • 👍 👍

    @martin91 大佬啥时候组织个 ruby 的

  • 说明 ruby 学起来容易,用起来容易!

  • Python 有干爹 Google。你看 Go。

    再一个 Python 语法简单,比较适合教学。

  • web 开发,瓶颈在 IO。

  • 用的是这个 https://dev.mysql.com/doc/refman/8.0/en/mysql-real-connect.html 方法

    楼主再验证下吧。

    话说,走内网,tcp 和 http 应该区别不大吧?

  • 有考虑过找 Java 然后转 Ruby 吗?

  • CAP 是说,裂了是保证可用性,还是一致性。

    裂了就裂了,不会管数据库在做什么。。。问题是裂了的时候,数据库做什么。。。要么不工作,要么工作,数据是错的。。。

    “一段时间内会读取不到新数据”这个就是保证可用性。

    PingCAP”这种方法牺牲了一定的可用性(在脑裂时部分客户端的可用性)换取了一致性的保证“,这个保证的是一致性。

  • 额,我是好奇,脑裂的情况下,你们是咋处理的。

  • 这个账号是你们团队的运营账号吧。。。在哪个帖子回复不是一样的。。。

  • 请教几个问题

    CAP 是 C 还 A?

    在就是求介介绍介绍锁相关或者是如何保证一致性的。

  • 大佬,不搞一搞吗?

  • 请教两个问题,

    换成容器后,会不会 long_schedule 的警告会多一些?需要处理吗?

    scheduler count 要调整吗?

  • 多线程的 Redis at 2019年08月20日

    IO 线程数的设置应该按照怎样的标准设置

    要靠 benchmark,主要要保证主线程一直在跑着。主线程如果比较闲,就加点。IO 线程消耗内存,太高了,不知道会不会爆。

    再就是要看看极端情况 redis 的表现。

    如果有慢 client 拖慢了整个读写过程怎么办?(主线程在阻塞)

    感觉是这里面 http://antirez.com/news/126 说的 slow command。要能提供 command 执行一版,切换出去的能力,要有锁,应该还要有 transaction。是否多线程,倒不是必须的。