关于后端:elixir-0070-不死的网络细数-Beam-集群和-Bitcoin-的类似之处

46次阅读

共计 2243 个字符,预计需要花费 6 分钟才能阅读完成。

常常浏览 ljzn(就是在下)的专栏的敌人们可能晓得,他平时最爱两样技术:beam 虚拟机和 bitcoin 网络。究其原因,可能是两者都在谋求构建一个永生的网络集群。指标相似,那么实现办法肯定会类似,咱们当初就来盘点一些 distributed erlang 和 bitcoin network 到底有多少相似的中央。

全联通网络

Bitcoin

Bitcoin 的矿工节点之间是高度联通的,这是由比特币的挖矿机制决定的。新的区块头中须要蕴含之前一个区块头的 hash,换句话说,矿工必须时刻察看网络中是否有新的区块呈现,而后跟在最新的区块前面进行挖矿。否则,矿工挖到的块很可能变成孤块,得不到任何处分。每慢一秒钟察看到新的区块,矿工的算力就被节约了 1 秒。另外,矿工也会被动把本人挖到的块发送给其它所有矿工,因为每慢一秒收回去,本人的块变成孤块的可能性就减少一分。所以最好的策略是连贯到所有其它矿工的节点。

Beam

分布式 Erlang 的节点之间是全联通的。咱们能够做一个小小的测试:

  • 在 2 个终端启动 2 个 erlang node:
$ iex --sname bob@localhost
$ iex --sname carl@localhost
  • 应用 carl 连贯到 bob:
iex(carl@localhost)2> Node.connect :bob@localhost
true
iex(carl@localhost)3> Node.list
[:bob@localhost]
  • 能够在 bob 看到 carl:
iex(bob@localhost)4> Node.list
[:carl@localhost, :alice@localhost]
  • 在新的终端启动 alice,并连贯到 bob:
zhanglinjie@MacBook-Pro-2 ~ % iex --sname alice@localhost
Erlang/OTP 22 [erts-10.7.2]  [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Interactive Elixir (1.10.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(alice@localhost)1> Node.connect :bob@localhost
true
  • 能够在 carl 看到 alice,因为分布式 erlang 的网络是主动全联通的:
iex(carl@localhost)4> Node.list
[:bob@localhost, :alice@localhost]

全局锁

Bitcoin

Bitcoin 应用区块来更新整个账本的状态,能够说整个区块链只有一个锁 ——— 区块。例如,目前的区块高度是 60001,那么全副的矿工都在竞争 60002 区块的所有权,而获胜的矿工将能够应用 60002 区块来更新账本状态,之后全副矿工再进入到 60003 区块的竞争中去。

Beam

在分布式 erlang 里提供了全局锁的性能.

  • 在 alice 获取一个全局锁,锁的 id 是 :lock1, 元组的第二个元素是请求者的 id
iex(alice@localhost)12> :global.set_lock {:lock1, self()}                 true
  • 在 carl 尝试获取这个锁,会发现被挂起。此时是在定时重试获取:
iex(carl@localhost)6> :global.set_lock {:lock1, self()}
  • 在 alice 开释这个锁:
iex(alice@localhost)13> :global.del_lock {:lock1, self()}                 true
  • 几秒后,看到 carl 获取胜利:
iex(carl@localhost)6> :global.set_lock {:lock1, self()}
true

全局注册名

Bitcoin

Bitcoin 应用随机数来保障每个用户领有惟一的地址,用户应用 256bits 的私钥生成公钥(进而转换成地址),反复的可能性微不足道。毛病也很显著,地址是人类难以记忆的的长度,须要第三方的注册名治理服务,例如 交易所,钱包 等来帮忙治理。

目前 Bitcoin 里尚未有原生的治理“可读的注册名”-> “ 地址“的映射的伎俩,但咱们可能通过比特币脚本来实现,这仍旧是非常前沿的技术,暂且不表。

Beam

在 erlang 里应用自增的计数器来让每个过程都领有一个惟一的 pid。对于近程节点的过程,其 pid 里会加上节点的信息,使得其全局惟一。另外,erlang 提供了全局的注册名管理机制,咱们来试验一下:

  • 在 carl 里将 shell 过程注册为 :god
iex(carl@localhost)10> :global.re_register_name :god, self()    
:yes
  • 在 bob 里尝试注册 :god, 返回 :no,示意注册失败,因为曾经被占用
iex(bob@localhost)17> :global.register_name :god, self()
:no
  • 在 carl 里登记 :god
iex(carl@localhost)14> :global.unregister_name :god
:ok
  • 当初在 bob 里能够注册 :god
iex(bob@localhost)18> :global.register_name :god, self()
:yes

小结

咱们粗略比照了一下这两样大同小异的技术,发现了其中一些乏味的共同点:

  • 全联通网络 (yes)
  • 全局锁 (yes)
  • 全局注册名 (maybe)

如果你对这个话题感兴趣,鼎力拍打???? 点赞按钮吧。

正文完
 0