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实现