快速的骆驼和云消息传递

Apache Camel是一个流行的,成熟的开源集成库。 它实现了企业集成模式 ,这是在集成分布式系统时经常出现的一组模式。 过去,我写过很多关于Camel的文章, 包括为什么我比Spring Integration更喜欢它 , 路由引擎 如何 工作 , 如何在AWS SQS中使用JMS选择器, 等等 。 骆驼03

Camel还实现了197个连接器/适配器,用于与外部系统对话(转到源代码,components /目录并运行此命令:ls -lp components / | grep / | wc -l), github还有很多 ,您可以编写你自己很琐碎。 与其他集成库相比,这为Camel提供了更广泛的连接选项。

最近,我很幸运能够帮助使用Camel的一家知名的顶级电子零售商。 他们接受在线订单并使用事件驱动的体系结构处理它们,其中包括发布事件,例如“ order_received”,“ order_cancelled”,“ order_ready_to_ship”等。 这些事件由有兴趣参与订单处理流程的微服务来处理,并且由于存在适当的EDA而被松散耦合。

这种类型的零售业务的性质是非常季节性的。 而且在一年中的某些时段(节假日等),负载往往会增加几个数量级。 因此,能够在不中断的情况下进行扩展以满足这些季节性高峰至关重要。

幸运的是,由于他们是一群聪明人,他们使用Apache Camel进行集成,尤其是其中一些服务的实现。 每个订单都会生成很多事件,因此必须及时处理它们,并保持其余的负载。 为此的排队服务是Amazon SQS,而Camel为此提供了一个AWS SQS组件 。

对于标称负载,Camel可以很好地处理这些事件。 但是当队列变得更深时,骆驼在跟上时遇到了一些麻烦。 每分钟仅收到200条消息,这没有通过气味测试。 深入研究发现,AWS库使您可以垂直扩展规模, 从而增加连接数并按批处理消息传递方式 (最多10条批处理消息)。 批处理很有帮助,实现了Camel来处理批处理,但是它仍然不够快,每小时只有大约1万条消息。

进一步挖掘后,我们可以看到只有一个线程正在处理消息队列的轮询。 因此,我们决定使用SEDA队列 ,而不是使用与轮询队列的线程内联处理消息,以便我们可以从SQS中提取消息并快速转储到内存队列中,这样就可以启动下一个轮询:

from("amazon-sqs://order.queue").to("seda:incomingOrders");from("seda:incomingOrders").process(do our processing in another thread...);

这使我们能够使用暂存事件驱动的体系结构模式处理负载。 这一变化使我们的性能再次提高到每小时约4万条消息,但是我们谈论的是一个非常受欢迎的商务站点,因此仍不足以进行扩展以满足高峰期系统的需求。

因此,我们又看了一眼,想知道为什么不能同时进行多个线程/连接轮询? AWS库是考虑到这一点编写的,但是没有一种方法可以配置Camel以针对这种特定类型的终端节点执行此操作。 Camel可以对其他端点(JMS,SEDA等)执行此操作,但是为此我们需要在Camel SQS中进行一些小的更改。

这就是使用开源,社区风格的开发理念的美妙之处:代码是开放的,社区欢迎变化,现在Camel及其功能的未来用户可以从这种协作中受益。

因此,我们犯了一个补丁 ,允许您设置的SQS队列concurrentConsumers选项,将斜升用于连接和查询队列的线程数。 像这样:

from("amazon-sqs://order.queue?concurrentConsumers=50").to(.... processing here....)

有关更多信息,请参见camel-sqs上的文档 。 此更改将是Apache Camel 2.15.0发行版的一部分,该发行版将在接下来的几周内发布。

通过此设置,我们能够处理黑色星期五和网络星期一可能在站点上引发的所有负载,一次处理每小时超过150万条消息。

谢谢开源!

翻译自: https://www.javacodegeeks.com/2015/02/very-fast-camels-and-cloud-messaging.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

antd react dva在model中使用另一个model的state值

const oldData yield select(({ baseDictionary }) > {return ([...customPageSetting.list,]) });

三角形类1

/* 程序的版权和版本声明部分 Copyright (c)2012, 烟台大学计算机学院学生 All rightsreserved. 文件名称: object.cpp 作者:刘清远 完成日期: 2013年3月29日 版本号: v1.0 输入描述:无 问题描述:设计求三…

不可将您的方法命名为“等于”

(当然,除非您确实重写了Object.equals() )。 我偶然发现了用户Frank的一个非常奇怪的Stack Overflow问题 : 为什么Java的Area#equals方法不能覆盖Object#equals? 有趣的是,有一个A…

C#GRPC 服务端与客户端通信,故障排除记录

文章目录前言一、问题一解决方法二、问题二解决方法前言 第一次建立GRPC服务端,客服端一直通不到服务端; 问题1: One or more errors occurred. (Status(StatusCodeInternal, Detail"Error starting gRPC call. HttpRequestException:…

青禾BBS数据库查询语句(动网)

数据字典:http://files.cnblogs.com/ahauzyy/dvbbs.rar 查询用户信息: SELECT * FROM dbo.Dv_User WHERE UserName茗迹 查询用户发帖总数: SELECT UserTopic FROM dbo.Dv_User WHERE UserName茗迹 查询用户被删的帖子数: SELECT UserDel FROM dbo.Dv_Us…

EE JSP:Servlet的反向外套

仅当页面数量少或需要精确控制生成的内容(二进制PDF等)时,才可以从Servlet生成HTML。 对于大多数应用程序,输出将是HTML,我们需要一种更好的方法来完成此操作。 这就是JSP(Java服务器页面)出现的…

moment 24小时与12小时区别

moment(values.data).format(YYYY-MM-DD HH:mm:ss)--------------24小时 moment(values.data).format(YYYY-MM-DD hh:mm:ss)--------------12小时主要取决于format中的时分秒的大小写

android 自定义xml属性

Android 自定义组件 Android 提供了非常精致的和非常强大的组件化模型,能够更加方便的构建UI,这些UI组件都是基于基本的layout类:View 和 ViewGroup。 部分能够用的widgets包括:Button,TextView,EditText,ListView,CheckBox,Radio…

Neo4j:带密码的TF / IDF(和变体)

几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到。 我首先将Wikipedia的TF / IDF示例之一翻译为cypher,以查看该算法的外…

验证码的设计,随机数的生成

只要将charNum改变就可以自定义设计生成随机数的个数。 //获取验证码的代码 void GetValidateCode() { validStr ""; Random rd new Random(); //创建随机数对象 //产生由 charNum 个字母或数字组成的一个字符串 …

There are multiple modules with names that only differ in ca

react antd 警告错误 原因:引用组件的大小写 // 原代码: import AddOrEditFrom from /components/Process/AddOrEditFrom; // 修改后代码 import AddOrEditFrom from /components/Process/AddOrEditFrom;

每个人都必须阅读的10篇Java文章

一个月前,我们发布了每个人都必须阅读的10篇SQL文章列表。 我们相信jOOQ博客上的文章列表将为我们的读者带来非凡的价值。 jOOQ博客是同时关注Java和SQL的博客,因此,一个月后的今天,我们发布了同样令人兴奋的10条Java文章列表&…

LeetCode: Longest Common Prefix

string.erase没掌握好&#xff0c;悲了个剧&#xff0c;2次过 1 class Solution {2 public:3 string longestCommonPrefix(vector<string> &strs) {4 // Start typing your C/C solution below5 // DO NOT write int main() function6 s…

React antd Descriptions span属性无效问题

label“Status” span{3}&#xff0c;但是span为3无效 <Descriptions title"User Info" layout"vertical" bordered><Descriptions.Item label"Product">Cloud Database</Descriptions.Item><Descriptions.Item label&quo…

如何在生产中检测和诊断慢速代码

开发人员面临的最困难的任务之一是查找和诊断生产中运行缓慢的代码。 首先&#xff0c;您如何监控生产代码而不放慢速度&#xff1f; 当然&#xff0c;您无法通过分析器运行生产代码。 即使您具有计时代码的机制&#xff0c;那么如何诊断问题呢&#xff1f; 如果您无法在开发环…

uni-app动态绑定class和style

目录动态绑定calss动态绑定style动态绑定calss class"[{‘类名’:条件},{‘类名’:条件},{‘类名’:条件}]" 为不同条件的image绑定不同的样式 <image class"img1" :class"[{img1:index 0},{img2:index 1},{img3:index 2}]":src"avt…

移动小球

描述 你有一些小球&#xff0c;从左到右依次编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;n&#xff0c; 你可以执行两种指令。其中A X Y表示把小球X移动到小球Y左边&#xff0c;B X Y表示把小球X移动到小球Y右边。指令保证合法&#xff0c;即X不等于Y。 输入 …

流式传输大数据:Storm,Spark和Samza

有许多分布式计算系统可以实时或近实时处理大数据。 本文将从对三个Apache框架的简短描述开始&#xff0c;并试图对它们之间的某些相似之处和不同之处提供一个快速的高级概述。 阿帕奇风暴 在风暴 &#xff0c;你设计要求的T opology实时计算的图&#xff0c;然后喂到集群&…

那天有个小孩跟我说LINQ(四)

小孩LINQ系列导航&#xff1a;&#xff08;一&#xff09; &#xff08;二&#xff09; &#xff08;三&#xff09; &#xff08;四&#xff09; &#xff08;五&#xff09; &#xff08;六&#xff09; &#xff08;七&#xff09; &#xff08;八&#xff09; 转载于:http…

uniapp使用阿里云多色图标

下载&#xff0c;然后解压 输入cmd&#xff0c;然后enter 输入 npm install -g iconfont-tools 再输入 iconfont-tools&#xff0c;然后一直enter&#xff0c;直到结束 目录会多了个iconfont-weapp文件&#xff0c;点击去找到 iconfont-weapp-icon.css 导入和使用 t-icon开头 接…