代码之家  ›  专栏  ›  技术社区  ›  ctomek

设计web服务的最佳方法,它必须以列表或类似结构存储来自请求的数据

  •  0
  • ctomek  · 技术社区  · 10 年前

    我的目标是创建JavaEEWeb服务,它将同时接受数千(或更多)个请求,并且必须以列表或类似结构存储来自请求的数据。我想将请求中的对象存储在内存中,但这不是必须的。将从每个请求中提取一些对象,并将其添加到选定的数据结构中。Web服务将有两个操作:添加到结构和从结构中删除。删除请求将包含对象实例变量的值。可能是唯一ID或其他一个或多个实例变量。将始终有一个对象要删除(如果请求无效,则为0)。具有相等实例变量值的对象将被删除。

    我的想法是使用两个EJB。首先是@Stateless,并作为web服务公开。它将从请求中提取对象,并调用第二个EJB来从数据结构中添加或删除所请求的对象。第二个EJB将是@Singleton,并且将具有实例变量ArrayList<>从请求中提取的对象数。正如我所说,它根本不必是ArrayList或List。

    我还考虑过使用一个EJB,它必须是@WebService@Singleton,但文档中说这种组合是“可能的,但……不受本规范的定义”

    2 回复  |  直到 10 年前
        1
  •  4
  •   cilap    10 年前

    Arjan,你的要求还不完全清楚。 假设您正在构建高负载应用程序>每秒1000个请求:

    Servlet处理

    • 将“对象”数据容器分离到每个用户的http会话中(如果http会话可用)
    • 将同步列表添加到http会话中,并在每个请求时对同步的私有列表执行操作,并将web客户端详细信息添加到此http会话存储列表中
    • 将httpsession列表的引用添加到下一个提到的SingletonEJB

    Singleton EJB

    • 创建单一EJB
    • 为提取/过滤/处理的YourObjectType类型的对象添加列表字段
    • 为基于HTTP会话且未过滤但已同步的列表的引用添加第二个集合

    计时器JB

    • 创建一个定时EJB,以便定期运行,例如每秒钟
    • 该函数将遍历refCol中的所有引用列表,并提取和过滤所需的对象,同时确保清理基于http会话的列表。

    解决方案的好处:

    • 将用户的mem负载推送到其会话
    • 不要在非常高的负载下陷入同步/互斥问题,因为您在Singleton bean中的中央过滤列表上使用timerJB操作的时间非常短。
    • 只要您的会话保持较小,您就可以进行长时间的扩展
    • 用于过滤的可能是CPU密集型解决方案和用于持久化过滤对象的IO密集型解决解决方案都在客户端请求之外,客户端将不会面临性能问题。
    • 计时器时间表可根据您的需要进行更改

    缺点:

    • 复杂度稍高
    • 您必须清除refColl中对已关闭http会话列表的引用。也可以通过在复合类中提供会话和对会话列表的引用,或者通过任何其他自定义解决方案。如果你不清理,你的堆会因为保存对已经被“杀死”的http会话列表的引用而变得臃肿。
        2
  •  1
  •   Zielu    10 年前

    您不能在WS上使用@Singleton,因为容器可能会初始化多个实例来处理大量请求。

    您的@Singleton bean不能使用ArrayList<>因为将存在并发访问。您应该改用ConcurrentLinkedQueue。 如何识别您的删除操作请求?也许ConcurrentHashMap会更好。

    如果你想拥有“数千(或更多)”内存,除非你将请求转储到DB或文件中,否则迟早会耗尽内存。带有JPA的DB将是最简单的,您可以在WS和Request对象上使用很少的注释来实现它。