【问题标题】:Sharing thread between processes进程间共享线程
【发布时间】:2025-11-24 14:10:01
【问题描述】:

我想这是不可能的。但我正在寻找最好的方法来分离我的服务的不同层,同时能够快速访问层或没有 IPC/RMI 开销。

我使用的主要编程语言是java,但如果需要也可以使用C++。

我们现在拥有的是一个托管数据库和访问控制的服务器。我们使用 RMI 供消费者请求数据。这很慢并且不能很好地扩展。

我们需要目前没有的性能和可扩展性。

我们正在考虑使用以数据库为基础的分层架构,在其上进行访问控制以及通知总线以通知客户端数据库的更改。 主要问题是我们希望避免/或最小化的通信开销。

是否有任何魔术线程可以在两个上下文(切换上下文)中运行并以这种方式共享信息。我知道简短的回答是否定的,但有哪些选择?

更新

  • 我们目前正在使用 Java RMI。

我们的基础层将提供一个 API,可用于创建将在其上运行的插件。所以它不是我们拥有的固定收藏家/消费者。我们可以运行 5-6 个收集器和相同数量的消费者。

我们最多可以有 1000 个消费者。

【问题讨论】:

  • 您需要支持多少个客户端会话?
  • 大约1000名消费者
  • 那不是很多。很难看出为什么标准解决方案是不够的。
  • 当前的解决方案与我们所做的负载测试相比不能很好地扩展。
  • 也许它需要调整。你用的是什么应用服务器?

标签: java database multithreading process communication


【解决方案1】:

我的第一个建议是,您应该购买一本书(或查找在线教程)来了解如何构建可扩展的应用程序,因为您似乎很迷茫。

在进程之间共享线程在任何层面都没有意义——毫无意义,但您可以共享线程访问的数据,这可能是您想要的。

最快的方法是基于 C 的 IPC(例如,共享内存、信号量等:Shmget)。你说你想避免 IPC 的开销,但实际上,它不会比这更快。

但是为什么你想要多个进程呢?如果您担心进程之间通信的开销,是否将线程放在一个进程中?您的不同层没有理由必须处于不同的进程中。

但无论如何,我不相信您最初关于 RMI 速度慢且无法扩展的说法是完全正确的。如果它没有扩展,您可能没有使用正确的框架。也许您有一个问题,即服务器上只有一个 RMI 端点。您是否考虑过使用无状态会话 bean 的 J2EE 系统?

不知道你的要求,很难说。

【讨论】:

    【解决方案2】:

    由于操作系统设计,通常不可能在两个进程之间共享线程。在两个或多个进程之间共享数据的问题通常通过共享文件、共享数据库或共享消息(这又可以是同步的或异步的)、让进程通过管道进行通信(例如在 Linux 中)甚至共享内存来解决。您的场景描述不是很精确,您需要描述所有流程以及信息应该如何流动,触发信息流动的原因等。

    您很可能需要高性能消息传递库,https://github.com/real-logic/Aeron/ 就是其中之一。但要获得准确的答案,您需要更好地描述您希望最小化的开销。

    【讨论】:

      【解决方案3】:

      如果您的目标是通知用户,您应该考虑发布/订阅消息传递 (pub/sub)。有许多中间件供应商提供这种架构,但大多数在生产场景中都很昂贵。对于开源,请查看http://redis.io/topics/pubsub。 (无从属关系。)

      【讨论】: