单个 Web 应用程序中多种编程语言的实现模式

Implementation patterns for multiple programming languages in a single web application

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

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

这是一个场景。如果我们有一个 Nodejs 应用程序,它从用户那里接受大约 100 个键值对数据(比如 JSON ),并且如果我们需要使用 Haskell... 来处理数据,这些数据被编译成二进制.

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

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

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

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

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

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

使用微服务架构。 微服务架构是一种架构,其中应用程序本身分为多个组件,每个组件都服务于特定目的。现在,这些组件统称为微服务。这些组件不再依赖于应用程序本身。这些组件中的每一个在字面上和物理上都是独立的。由于这种出色的分离,您可以为每个组件(也称为微服务)拥有专用的数据库,并将它们部署到单独的主机/服务器,此外,还可以为每个微服务使用特定的编程语言。

  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) 编写的函数。这应依赖于 require() 函数,该函数应将 Addon 作为普通 Node.js 模块加载。

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

如果您想从 python 调用 Go 函数,则可以使用 ctypes foreign function library 调用导出的 Go 函数

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

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

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

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