Apache camel 如何在apache camel中执行gcp pubsub消息的并行处理

Apache camel 如何在apache camel中执行gcp pubsub消息的并行处理,apache-camel,google-cloud-pubsub,Apache Camel,Google Cloud Pubsub,下面的代码从pubsub源主题中获取消息->根据模板转换消息->然后将转换后的消息发布到目标主题 但是为了提高性能,我需要并行完成这项任务,即我需要轮询500条消息,然后并行转换,然后将它们发布到目标主题 根据camel gcp组件文档,我相信maxMessagesPerPoll和concurrentConsumers参数可以完成这项工作。由于缺乏文档,我不确定它在内部是如何工作的 我的意思是a)如果我轮询500条消息,那么它会创建500条并行路由来处理消息并将其发布到目标主题b)消息的顺序如何

下面的代码从pubsub源主题中获取消息->根据模板转换消息->然后将转换后的消息发布到目标主题

但是为了提高性能,我需要并行完成这项任务,即我需要轮询500条消息,然后并行转换,然后将它们发布到目标主题

根据camel gcp组件文档,我相信maxMessagesPerPoll和concurrentConsumers参数可以完成这项工作。由于缺乏文档,我不确定它在内部是如何工作的

我的意思是a)如果我轮询500条消息,那么它会创建500条并行路由来处理消息并将其发布到目标主题b)消息的顺序如何c)我应该将并行处理EIP作为替代方案吗

等等

我不清楚这个概念

走了吗

// my route
private void addRouteToContext(final PubSub pubSub) throws Exception {

    this.camelContext.addRoutes(new RouteBuilder() {
        @Override
        public void configure() throws Exception {

            errorHandler(deadLetterChannel("google-pubsub:{{gcp_project_id}}:{{pubsub.dead.letter.topic}}")
                    .useOriginalMessage().onPrepareFailure(new FailureProcessor()));




            /*
             * from topic
             */
            from("google-pubsub:{{gcp_project_id}}:" + pubSub.getFromSubscription() + "?"
                    + "maxMessagesPerPoll={{consumer.maxMessagesPerPoll}}&"
                    + "concurrentConsumers={{consumer.concurrentConsumers}}").
            /*
             * transform using the velocity
             */
            to("velocity:" + pubSub.getToTemplate() + "?contentCache=true").
            /*
             * attach header to the transform message
             */
            setHeader("Header ", simple("${date:now:yyyyMMdd}")).routeId(pubSub.getRouteId()).
            /*
             * log the transformed event
             */
            log("${body}").
            /*
             * publish the transformed event to the target topic
             */
            to("google-pubsub:{{gcp_project_id}}:" + pubSub.getToTopic());
        }
    });
}

当您提到
concurrentConsumers
选项(假设
concurrentConsumers=10
)时,您要求Camel创建一个包含10个线程的线程池,这10个线程中的每一个都将从发布子队列中拾取不同的消息并对其进行处理

这里需要注意的是,当您指定concurrentConsumers选项时,线程池使用固定大小,这意味着固定数量的活动线程始终在等待处理传入消息。因此,10个线程(因为我指定了concurrentConsumers=10)将等待处理我的消息,即使没有10条消息同时传入

显然,这并不能保证传入消息的处理顺序相同。如果希望邮件的顺序相同,可以查看以对邮件进行排序

至于你的第三个问题,我不认为GooglePubSub组件允许并行处理选项。你可以用电脑自己制作。这肯定会给您更多的并发控制

使用线程,您的代码将如下所示:

from("google-pubsub:project-id:destinationName?maxMessagesPerPoll=20")
// the 2 parameters are 'pool size' and 'max pool size'
.threads(5, 20)
.to("direct:out");

当您提到
concurrentConsumers
选项(假设
concurrentConsumers=10
)时,您要求Camel创建一个包含10个线程的线程池,这10个线程中的每一个都将从发布子队列中拾取不同的消息并对其进行处理

这里需要注意的是,当您指定concurrentConsumers选项时,线程池使用固定大小,这意味着固定数量的活动线程始终在等待处理传入消息。因此,10个线程(因为我指定了concurrentConsumers=10)将等待处理我的消息,即使没有10条消息同时传入

显然,这并不能保证传入消息的处理顺序相同。如果希望邮件的顺序相同,可以查看以对邮件进行排序

至于你的第三个问题,我不认为GooglePubSub组件允许并行处理选项。你可以用电脑自己制作。这肯定会给您更多的并发控制

使用线程,您的代码将如下所示:

from("google-pubsub:project-id:destinationName?maxMessagesPerPoll=20")
// the 2 parameters are 'pool size' and 'max pool size'
.threads(5, 20)
.to("direct:out");
a) 如果我轮询500条消息,它会创建500条并行路由来处理消息并将其发布到目标主题吗

不,在这种情况下,Camel不会创建500个并行线程。正如您所怀疑的,并发使用者线程的数量是用
concurrentcumpers
设置的。因此,如果使用500的
maxMessagesPerPoll
定义5个
concurrentConsumers
,每个consumer将获取多达500条消息,并在单个线程中逐个处理它们。也就是说,您有5条并行处理的消息

信息的顺序如何

一旦您并行处理消息,消息的顺序就会混乱。但是,当您遇到处理错误时,这已经发生在1个消费者身上,并且这些错误会转到您的
死信频道
,然后重新处理

我是否应该将并行处理EIP作为替代方案

仅当
concurrentConsumers
选项不足时

a) 如果我轮询500条消息,它会创建500条并行路由来处理消息并将其发布到目标主题吗

不,在这种情况下,Camel不会创建500个并行线程。正如您所怀疑的,并发使用者线程的数量是用
concurrentcumpers
设置的。因此,如果使用500的
maxMessagesPerPoll
定义5个
concurrentConsumers
,每个consumer将获取多达500条消息,并在单个线程中逐个处理它们。也就是说,您有5条并行处理的消息

信息的顺序如何

一旦您并行处理消息,消息的顺序就会混乱。但是,当您遇到处理错误时,这已经发生在1个消费者身上,并且这些错误会转到您的
死信频道
,然后重新处理

我是否应该将并行处理EIP作为替代方案


仅当
concurrentConsumers
选项不足时

谢谢你Sneharghya,你已经非常清楚地解释了我要找的概念。谢谢bunchthank你Sneharghya,你已经非常清楚地解释了我要找的概念。谢谢bunchthank你burki,你已经清楚地解释了我难以理解的问题。我现在很好。非常感谢-谢谢burki,你已经清楚地解释了我难以理解的问题。我现在很好。非常感谢-