Hasty Briefsbeta

双语

Calling Go from Elixir with a CNode in Crystal

a year ago
  • #Crystal
  • #Go
  • #Elixir
  • 墨子需要将Elixir Phoenix LiveView应用连接到现有的Go后端
  • 考虑过的方案包括NIFs(原生实现函数)和Ports,但两者都存在缺陷
  • 最终选择通过Erlang的erl_interface库构建'C节点'实现BEAM分布式通信
  • 构建了C语言封装层调用Go代码,主程序用C编写并从那里初始化Go
  • C节点通过预定义的本地地址连接到Elixir应用,在容器中由S6管理
  • 考虑过使用Ergo(Go实现的BEAM分布式协议),但因兼容性和许可问题未采用
  • 后来用Crystal语言重写了C代码以提高可维护性,仅对erl_interface做薄封装
  • 系统以单个Docker容器部署在Kubernetes中,Elixir和Go/Crystal组件独立构建
  • 曾临时需要定制Go编译器构建以支持Alpine Linux,但该需求即将消失
  • 开发者表示有兴趣开源其Crystal语言封装的erl_interface实现