首页 > 解决方案 > 单个 Web 应用程序中多种编程语言的实现模式

问题描述

我只使用一种编程语言(如 python 或 js)创建了 Web 应用程序。

我知道使用多种编程语言来创建高级服务。但我不知道它是如何一起工作的,实现它的不同模式是什么。

这是一个场景。如果我们有一个 Nodejs 应用程序可以接受来自用户的 100 多个键值对数据(比如 JSON),并且如果我们需要使用 Haskell 处理这些数据……这些数据会被编译为二进制文件。

我有一个数据层次结构,比如一组人和他们的经理,以及一些绩效指标和他们的观点。我想将它们传递给用 Haskell 编写的程序,以根据它们的角色等计算一些值......

可以使用哪些方法将数据传递到程序中?

我应该运行一个接受 JSON 值(通过 HTTP)并在 Haskell 中解析它们的服务器吗?

或者我可以以其他方式将它们与我的 nodejs 应用程序链接起来吗?在这种情况下,如何将数据从 nodejs 应用程序传递到 Haskell?

我还担心延迟,这是每次请求时都会发生的实时计算。

例如,facebook 使用 Haskell 进行垃圾邮件过滤,一位工程师表示他们在该服务中使用 c++ 和 Haskell。c++ 接受输入传递给 Haskell,后者返回信息。接口在这里如何工作?

标签: webmicroservicesbackend

解决方案


  What are the methods used to pass the data into the program ? Should the binary services be Daemon ?
  • 确切的方法取决于手头的确切要求,计划使用的软件组件。

  • 如果您正在寻找不同语言之间的互通,有多种方法。

基于Addons(用 C++ 编写的动态链接共享对象)的方法提供了 JavaScript 和 C/C++ 库之间的接口。外部函数接口 (FFI) 和动态库 (.dylib) 允许从主机 (node.js) 语言中调用以另一种语言 (rust) 编写的函数。这将依赖于将 Addon 作为普通 Node.js 模块加载的 require() 函数。

例如,node-ffi 插件可用于创建与本机库的绑定,而无需编写任何 C++ 代码来使用纯 JavaScript 加载和调用动态库。基于 FFI 的方法也用于动态加载和调用导出的 Go 函数。

如果您想从 python 调用 Go 函数,那么您可以使用 ctypes 外部函数库来调用导出的 Go 函数

  • 如果您正在寻找一种架构的设计模式,该架构可以容纳由各种语言构建的模块、服务,这取决于您的确切应用程序和性能要求。

一般来说,如果您想利用新兴技术(各种语言、框架)开发松散耦合的解决方案,那么基于微服务的架构可能更有益。这将带来更多的独立性,因为模块/服务的更改不会严重影响其他服务。如果您的应用程序很大/很复杂,那么您可能需要使用微服务模式,例如“按业务能力分解”或“按子域分解”。有许多与微服务模式相关的模式,例如“每个服务的数据库”模式,其中每个服务都应根据您的要求拥有自己的数据库,“API 网关”模式基于客户端如何访问服务(“客户端发现模式”或“服务器端发现模式”

反过来,该方法还应基于消息传递机制(同步/异步),根据解决方案要求在微服务之间的消息格式。

  • 对于近乎完美的设计,您可能需要使用所选方法对您的组件(包括软件和硬件)进行一些原型设计和性能测试/负载测试/分析,并检查是否满足各种系统要求/性能指标并做出相应决定。

推荐阅读