相当于执行 select * from some_table,考虑到行数,这个本身就很慢。也许是这个还没返回。
如果 crash 的话,应该是内存爆掉了。
不过石锤还是要试试看。
解决方案其他人已经说了。
那种可以按秒付费的,用的时候就开,不用的时候就删。
redis 单线程,mac 4 core 足够玩集群了。benchmark 在云上搞就可以。
启动的时候,把所有表读出来,然后动态创建 model 呢?
就是 http 请求而已。。。一般不这么做,罢了。看你是什么需求。
能
@WalkPhoneGo 功能、性能、可靠性,这些是不同的东西?为啥跟你讨论可靠性,你为什么非要说功能和性能呢?
至于为什么,不好意思我没研究过。
其实挺期待你说说原因的。
那按照你的逻辑,我试着回复一下哈。
1 无脑堆机器 不行
行
大量用户 是多少 稍微多一点人 AC 就是一具尸体了
没事
这个不是框架能保证的 需要自己实现
1、2、4、6 都是功能,需要自己实现。
如果这么理解可靠性,也不是不可以。
关于这个模块,我说下我理解的可靠性吧。
坦白的讲,我不是很介意性能差一点,但 AC 似乎是很不怎么好。更在乎这个模块可不可以横向扩展。能横向能扩展,就可以无脑堆机器。
再就是,在一些奇奇怪怪的场景下,这个服务还可以健康的活着。比如大量用户重连的情况下、流量激增、一台机器突然挂掉,剩下的节点是不是能正常工作。
以及,用户断连到重连,这段时间内的消息,要怎么处理(有单独服务处理会更好)。能不能确认消息已经传到客户端有单独服务处理会更好)。再复杂一点,有序。
是一台物理机,记得没错是 120g 的内存。
但这个是性能吧?还看过 go 可以几个 G 百万并发。。。
虽然 go 性能看起来更好,但 erlang 在这个场景更合适。
因为 erlang 有抢占式调度,go 没有。erlang 有并发模型,go 的 channel 相对来讲太简单了。很多东西做不了,或者不好做。
我问的不是 phoenix 性能好不好好,也不是想跟你讨论,phoenix 和 rails 相比,哪个好。
我就是想问。
我理解,你回答的 1、2、4、6 都是功能的问题。 3、5 是性能的问题。
大体上(看起来都没问题,不过没仔细看),暂时都同意你的说法。
最后再强调下
从服务端,发出去的消息,客户端一定能收到。
这个 phoenix 是怎么做到的?还是说,可靠性不考虑这一点?
怎么样让某个客户端的多次请求 让一个线程内处理 用 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 配置一下,可以存到磁盘里
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 年了。我不是作者,改不了。。。
伯克利有门课用的是 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”这种方法牺牲了一定的可用性(在脑裂时部分客户端的可用性)换取了一致性的保证“,这个保证的是一致性。
额,我是好奇,脑裂的情况下,你们是咋处理的。