如何在Linux中的同一过程中加载库的两个版本?

问题描述

我正在一个项目中,我需要在Linux的同一应用程序中加载同一库的两个版本。我发现要能够成功完成此操作而不会出现任何库冲突问题,我必须使用其自己的导出映射对两个库的版本进行符号化。似乎如果正在运行的应用程序具有此类引用“ name @@ nodename”,则Linux中的动态加载程序将仅在nodename中查找名称,而不在其他位置查找名称。这是我对两个库进行符号版本化的原因而得出的结论。这个推理正确吗?在没有库冲突的情况下,是否还有其他选项可以在同一应用程序中加载同一库的两个版本?

解决方法

如果您控制使用该库的代码,则简单的操作就是升级/降级,因此您不必依赖同一库的两个不同版本。如果您项目的另一部分也依赖于该库,或者您与另一个第三方库存在相同的问题,那么您将需要做更多的工作。这会减慢您的升级路径。

如果这是一个大型项目,并且两个端点不相关,则可能需要将它们拆分为单独的服务/进程,并在它们之间使用一些进程间通信(IPC)层。例如消息队列,管道或套接字。这种方法称为微服务架构。在某些方面,此解决方案可以更好地扩展,您拥有IPC层引入的开销,但是新结构可能更易于理解,调试和测试。

另一种方法是自己实现此第三方依赖项的功能。您可以满足两个版本的要求。如果该库是开源的,那么一半的工作已经在那儿了。此选项提供了极大的灵活性,因为您可以根据需要进行调整,而以开发人员的开销为代价。

您使用导出映射的解决方案是有效的,但可能难以维护,因此我不建议您这样做。对于大型库,如果没有脚本,它甚至可能不可行。要升级时会发生什么?