【问题标题】:Optimizing events processing优化事件处理
【发布时间】:2019-08-08 06:59:01
【问题描述】:

我在我的 java 服务器组件中使用 Oracle 的 Coherence 缓存。 我正在使用以下事件处理程序订阅和收听缓存更改事件:

public void entryUpdated(MapEvent mapEvent) 
        { 
         processUpdateEvent(mapEvent);
        }

public void entryDeleted(MapEvent mapEvent) 
        {
        //processDeleteEvent(mapEvent);
        } 
    public void entryInserted(MapEvent mapEvent) 
        {
             processInsertEvent(mapEvent);
        } 

有时,我们会在缓存中获得大量“更新”事件流(“删除”或“插入”事件的数量非常少)...看来我们当前的 Java 代码的可扩展性不够来处理这种情况。因此,它在事件处理方面落后了。

我正在尝试重新设计和优化这段代码。

我想到的一件事是使用以下方法。但我认为这没有意义,因为它会为每个新事件启动新线程,这将再次降低服务器的整体性能。 请问有没有其他方法可以优化这段代码?

Thread thread = new Thread(new Runnable() {
                    public void run() {
processUpdateEvent();
                       }
                    });
                thread.start();

谢谢。

【问题讨论】:

  • 到底是什么问题?处理更新事件需要太多时间?
  • 是的,似乎在“事件 1”处理完成时,事件 2/3/4.. 已经到达,这造成了延迟。谢谢。
  • 您可以尝试使用具有预定义运行线程数的线程池来并行处理您的事件(如果可能的话)。
  • 为什么 processUpdateEvent();和 processInsertEvent();在没有参数“mapEvent”的情况下调用?他们如何知道更新/插入了哪些项目?
  • 我的错..现在更新了问题..

标签: java multithreading events oracle-coherence


【解决方案1】:

一致性侦听器与单个线程一起工作,因此唯一可能的解决方案是将事件进程委托给另一个线程,并尽快让侦听器线程空闲。

优化事件驱动架构的可能解决方案是要求您进行架构更改:您可以在数据存储节点上注册拦截器并将事件写入主题 kafka。这样,每个拦截器将只处理部分事件(仅在同一数据存储节点中创建的事件),并且您的 Kafka 消费者池可以配置为高性能和高可用性。

一致性侦听器方法的另一个风险是您无法获得集群客户端和高可用客户端。

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 2016-09-18
    • 2023-03-24
    • 2011-07-04
    • 1970-01-01
    • 2016-01-08
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多