从 Azure 事件中心获取事件后,我是否应该将其放入队列中?

2024-05-19

我目前正在开发一个托管在 Azure 上、使用 Azure 事件中心的应用程序。基本上,我从 Web API 向事件中心发送消息(或者应该说事件),并且我有两个侦听器:

  • 用于实时分析的流分析任务
  • 标准辅助角色,根据接收到的事件计算一些内容,然后将它们存储到 Azure SQL 数据库中(这是 lambda 架构)。

我目前正在使用事件处理器主机 https://www.nuget.org/packages/Microsoft.Azure.ServiceBus.EventProcessorHost用于从我的辅助角色内的事件中心检索事件的库。

我正在尝试找到一些有关如何使用事件中心的最佳实践(使用事件中心比使用服务总线队列更难,即流式处理与消息消耗),我发现有些人说我不应该在检索后进行大量处理EventData我的事件中心的事件.

具体来说 :

  • http://blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx http://blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx

请记住,您想要相对保留正在做的事情 快速 - 即不要尝试从这里执行许多流程 - 这就是 消费群体是为了。

  • http://blogs.msdn.com/b/musings_on_alm_and_software_development_processes/archive/2014/09/03/azure-event-hubs-queues-and-workers.aspx http://blogs.msdn.com/b/musings_on_alm_and_software_development_processes/archive/2014/09/03/azure-event-hubs-queues-and-workers.aspx

本文作者在事件中心和事件中心之间添加了一个队列 工人角色(从评论中不清楚是否确实需要 或不)。

所以问题是:我应该在事件中心之后直接进行所有处理工作吗(即在ProcessEventsAsnyc我的方法IEventProcessor https://msdn.microsoft.com/en-us/library/hh435336.aspx执行),或者我应该在事件中心和处理内容之间使用队列?

任何有关如何正确使用事件中心事件的建议将不胜感激,文档目前有点......缺失。


这属于这样一个问题的类别,一旦 EventProcessorHost 的源代码可用,其答案将更加明显,我被告知这将会发生。

简而言之,您不需要使用队列;只需使用队列即可。但是,我会保持 ProcessEventsAsync 返回任务所需的时间相对较短。

虽然这个建议听起来很像第一篇文章 http://blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx,关键区别在于它是返回任务的时间而不是任务完成的时间。我的假设是在用于 EventProcessorHost 的线程上调用 ProcessEventsAsync 以用于其他目的。在这种情况下,您需要尽快返回,以便继续其他工作;这项工作可能会为另一个分区调用 ProcessEventsAsync (但如果不进行调试,我们就不会知道,我还没有发现有必要在可用时执行或读取代码)。

我通过从 ProcessEventsAsync 传递整个 IEnumerable 在每个分区的单独线程上进行处理。这与从 IEnumerable 中取出所有项目并将它们放入队列中以供处理线程使用形成对比。另一个线程在处理完消息后完成 ProcessEventsAsync 返回的任务。 (实际上,我为我的处理线程提供了一个 IEnumerable,它通过将块链接在一起并在调用 MoveNext 时完成任务(如果需要)来隐藏 ProcessEventsAsync 的详细信息)。

简而言之:在 ProcessEventsAsync 中,将工作移交给另一个线程,无论是您已经拥有的知道如何与之通信的线程,还是使用 TPL 启动新任务的线程。

将所有消息放入 ProcessEventsAsync 内部的队列中不是bad这并不是将事件块传递到另一个线程的最有效方法。

如果您决定将事件放入队列(或者在处理代码的下游有一个队列)并完成批处理任务,则应确保限制代码/队列中未完成的项目数量,以避免运行由于流量高峰,EventHub 为您提供项目的速度超过了代码处理项目的速度,导致内存不足。

Java EventHub 用户注意事项2016年10月27日: 自从这引起我的注意以来这个描述 https://github.com/Azure/azure-event-hubs/blob/06c0c637438af6e6aba366b211ff920a34d9db38/java/azure-eventhubs-eph/src/main/java/com/microsoft/azure/eventprocessorhost%5C/EventHubPartitionPump.java#L194描述如何调用 onEvents,同时onEvents https://github.com/Azure/azure-event-hubs/blob/master/java/azure-eventhubs-eph/src/main/java/com/microsoft/azure/eventprocessorhost/IEventProcessor.java#L56慢不会是悲剧,因为它在每个分区的一个线程上,它的速度appears影响接收下一批的速度。因此,取决于您对延迟的关心程度,这里的延迟对于您的场景来说可能相对重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Azure 事件中心获取事件后,我是否应该将其放入队列中? 的相关文章

  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐