问题标签 [event-based-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
microservices - 基于微服务的架构中的最终一致性暂时限制了功能
我将用 Twitter 说明我的问题。例如,Twitter 具有基于微服务的架构,这意味着不同的进程位于不同的服务器中并拥有不同的数据库。
出现一条新推文,服务器 A 在其自己的数据库中存储一些数据,生成新事件并触发它们。服务器 B 和 C 此时没有收到这些事件,也没有在他们的数据库中存储任何内容,也没有处理任何内容。
创建推文的用户想要编辑该推文。为了实现这一点,所有三个服务 A、B、C 应该已经处理了所有事件并将所有需要的数据存储到 db,但是服务 B 和 C 还不一致。这意味着我们目前无法提供编辑功能。
正如我所看到的,一种可能的解决方法是切换到立即一致性,但这会带走所有基于微服务的架构优势,并且可能会导致紧耦合问题。
另一种解决方法是在一段时间内限制用户的操作,直到所有必要服务的数据不一致。可能是一个解决方案,取决于客户及其业务需求。
另一种解决方法是添加额外的逻辑或可能的服务 D,它将编辑存储为用户的操作,并仅在它们一致时将其应用于数据。缺点是大大增加了系统的复杂性。
并且有两阶段提交,但那是 1) 不是很可靠 2) 慢。
我认为在 Twitter 的负载情况下,缓慢是一个巨大的缺点。但也许它可以被解决,而缺乏可靠性则不能,同样,如果不增加解决方案的复杂性。
所以,问题是:
- 对于图示的情况是否有任何好的解决方案,或者只有我提到的解决方法?也许一些编程平台或数据库?
- 我是否误解了某些东西并且某些解决方法不正确?
- 除了最终一致性之外,是否还有其他方法可以保证所有数据都将被存储并且所有必要的操作都将由其他服务执行?
为什么为这个用例选择了最终一致性?正如我所看到的,如果我们谈论的是事件驱动的方法,当某些服务将在某些事件被触发时开始工作时,它是保证某些数据将被存储或某些操作将被执行的唯一方法,并且按照我的示例,该事件将是“已创建推文”。因此,如果服务 B 和 C 出现故障,我需要在它们再次启动时能够成功执行操作。
我想要达到的目标是:可靠性、承受高负载的能力、足够复杂的解决方案。任何相关主题的任何链接将不胜感激。
如果这种方法有自然的局限性,而我想要的不能使用这种范式实现,那也没关系。我只需要知道这个问题真的还没有解决。
c# - C# - Handling Fault Exceptions in event-based WCF proxy
I am consuming a WCF service using an event-based proxy generated by Visual Studio. I have run into an issue, where my application will hang if the call to the service times out. The call to the service is as follows:
Browsing through countless other questions, the general consensus is that any exceptions should be caught by WCF and found in e.Error
above. However, when my service times out, this is not the case, the error is either null, or in some other tests I've run, the app has crashed before reaching this point in the code. Another user suggested wrapping the above code in a try/catch block, however, doing this also fails to catch the exception.
I have also tried placing try/catch blocks inside the completion handler, as well as numerous other more complicated methods which are beyond the scope of the question, as I really just need this working in its simplest form to continue.
It may also be worth mentioning that while many of these failures occurred on the live service with a open, close, send, and receive timeout of 30 seconds each, I have also been attempting to test fixes to the issue by bringing the timeout down to <1 second. I presume this would still be generating Timeout Exceptions and not causing any other issues, but I'm not 100% sure.
I also did not create the WCF service, so if something specific needs to be done on the server side to throw exceptions back to the client, it is possible this element is missing. If this is the case, is there any way around this?
android - 在 Android 上按主题分发事件
我是 Android 环境中的新手,正在尝试发布主题事件,目前使用“ EventBus ”框架,但似乎找不到这样做的选项。
例子:
假设我有一个“ConversationUpdateEvent”,但想按主题或特定对话 ID 的键触发事件。
就像是:
订阅:
火:
只有确切对话 ID 的订阅者会收到通知
python - 将 Pika 与 Django 一起使用(使用 django rest 框架的基于事件的微服务)
这里有人有使用 Django 实现 pika 的经验吗?我基本上是使用 django rest 框架运行基于事件的微服务。并使用 RabbitMQ 作为消息总线。我知道在这种情况下使用的默认库是 Celery,但我正在寻找一个更轻的版本,我可以在消息上实现一个简单的 pub/sub。
以前有人用 pika 实现过这样的服务吗?我的问题是你如何将 pika 作为一个单独的进程与 Django 一起生成?还是有更优雅的解决方案?
提前致谢。
- - 更新 - -
我们最终做的是:
对于发布者:
- 我们生成了一个单独的线程(如果您需要发布大量/秒,则可以创建多个线程)来保持 pika 连接处于活动状态。
对于订户:
- 我们生成一个单独的工作进程(在一个单独的容器中),它具有 django 上下文(使用 django.setup()),它使用来自 RabbitMQ 的消息
testing - 如何确保所有情况都包含在基于事件的并发设置中?
在SICP 3.4.2 中存在不同进程中事件顺序的问题。
假设我们有两个进程,一个具有三个有序事件 (a,b,c),一个具有三个有序事件 (x,y,z)。如果两个进程同时运行,并且对它们的执行如何交错没有限制,那么事件有 20 种不同的可能排序,这些排序与两个进程的单独排序一致。
作为设计这个系统的程序员,我们必须考虑这 20 个排序中每一个的影响,并检查每个行为是否可以接受。随着进程和事件数量的增加,这种方法很快变得笨拙。
是否有任何工具/最佳实践可以帮助程序员确保涵盖每个逻辑上不同的情况?
如果程序员可以在它们之间定义一组事件和约束,并且该工具将返回所有有效的事件顺序(识别和分组类似的循环模式),那就太好了。
给定可能的事件流列表,程序员将能够添加/删除/修改约束。
这个问题对我来说很重要,因为我遇到的最多的错误与一些竞争条件或一些未处理的情况有关。
我真的不想使用具有某些高级类型系统的特定语言,我宁愿拥有一种独立于技术/语言的解决方案,它充当某种助手 - 设计和记录系统:及其事件、约束(和状态)。
这对我来说将是圣杯。
我正在寻找这些主题的解决方案:形式方法、形式验证、序言(因为详尽的搜索和逻辑)、并发性、依赖类型、基于事件的编程、多种类型的测试、契约式设计、圈复杂度;但他们都没有给我答案。此外,深入研究类型理论似乎是一种矫枉过正。
asp.net-core - 使用或不使用 Akka.NET 的微服务开发
我们正在尝试使用 Asp.NET Core 在当前环境中创建新应用程序来实现微服务架构。我们的第一代微服务将使用请求/回复通信模式,不需要任何消息代理。但是,我们将在 2 年后拥有一个 Message Broker。
两年后是否需要在开发方面付出很多努力才能使我们的微服务适应使用消息代理并采用发布/订阅通信模式?
什么是好方法?我们现在应该在没有 Message Broker 的情况下使用 Akka.NET 之类的东西吗?我们应该稍后实现 Akka.net 以使微服务使用 pub/sub 通信模式吗?
感谢和appriciate各种建议。
apache-kafka - 基于事件的 Kafka + 调度设计
在使用 kafka 的基于事件的电子商务系统中,您如何处理处于 pending_payment 状态的订单自动过期?
通常,每当客户请求创建新订单时,都会向主题发送一条消息,以便库存服务可以消耗和保留客户订单的物品。订单的状态将转换为pending_payment
。对于pending_payment
状态中的每个订单,订单中的项目将保留 30 分钟。我想自动使订单过期并以可扩展的方式回滚商品的数量。
我能想到的一种方法是在 30 分钟内安排一个 cron 作业,该作业将使特定订单过期并放回物品的数量,但有没有更有效的方法来做到这一点?为每个订单创建一个 cron 作业是否可行?
rest - 使用 REST API 封装基于事件的系统
我正在设计一个系统,该系统使用基于事件的通信(使用 Google Cloud Pub/Sub)的微服务架构。
每个服务都在侦听和发布消息,因此服务之间的一切都非常好。
最重要的是,我想提供一个 REST API,用户可以在不破坏基于事件的方法的情况下使用它。但是,如果我有一个触发事件 X 的端点,我将如何将响应发送给用户?为“ProcessXComplete”事件创建订阅者并返回 200 OK 是否有意义?
例如:
我有以下微服务:
- 服务A
- 服务乙
- 前端服务 - REST 端点
我想发送这个请求“POST /posts”——这个请求发送到前端服务。前端服务应该触发“NewPostEvent”。Service A 和 Service B 都会监听这个事件并做一些事情。
到目前为止,一切都很好,但这就是我开始变得混乱的地方。现在我想向发出请求的用户返回操作完成的有效响应。我怎么知道所有服务都完成了它们的任务,以及如何创建处理程序来返回这个响应?
这样做是否有意义,或者是否有更好的设计来实现服务之间基于事件的通信并提供 REST API
python - 我可以使用 Python 3 'with open(filename, mode) as file:' 并将其保存在对象中以发送事件吗?
我正在编写一个允许创建不同类型的日志文件(原始、CSV、自定义数据格式)的管理器类,并且我想保持日志文件打开以在它们进入时写入行。日志文件可以也可以通过事件(按钮按下、条件)启动和停止。
我想知道我是否可以将with open('file') as file:
语法与类中的实例变量结合起来 - 所以我不会在文件打开时陷入循环轮询,而是可以按事件写入文件。
我知道如何使用 open 和 close 方法,但是每个人都说“with”更加健壮,并且(更多)肯定会将文件写入磁盘。
我想做这样的事情:
并像这样使用它:
...然后离开方法,做其他事情来刷新屏幕,响应其他事件,然后当数据行进入时:
然后我希望事情能够干净地关闭,当 lf 消失时文件会被刷新到磁盘 - 无论是在程序关闭时隐式关闭,还是在我将 lf 设置为 None 时显式地。
当我尝试这个时,文件(显然)在创建 lf 时关闭。我可以检查 lf 并看到
但是当我尝试使用时lf.write("text")
,我得到:
有没有办法使用“with”并将其保存在一个实例中?
如果做不到这一点,我是否应该只使用 open、close 和 write,并确保我在init中有 try/except/finally并在exit中关闭?
events - 基于事件的与版本化事件的集成
我想使用事件来传达我的服务。我将(内部)发布我所有的域事件并允许任何其他服务订阅它们。但是这种方法将这些服务结合在一起。我不再被允许更改我的事件。这甚至比本地耦合更糟糕,因为我不再了解我的消费者。这将开发/重构的能力限制在不可接受的范围内。我正在考虑对我的事件进行版本控制,以解决大多数问题。但是如何订阅版本化事件呢?引入将所有事件版本分组的通用接口,然后将侦听器中的事件向下转换为已接受的事件,这听起来并不是一个重要的解决方案。我还考虑将所有支持的事件版本发布到总线。根据定义,每个订阅者将只处理一个版本。我不希望我的域参与此事务,因此我需要构建一种基础设施侦听器,它将捕获的事件转换为其他版本。我在互联网上找不到任何关于该主题的内容,这让我不由自主地思考我是否完全错了:)
更新:经过深思熟虑,我不再想发布我的领域事件。我认为将内部服务机制暴露给外部世界是不可取的。它还可能违反某些域数据访问限制。我认为,要走的路是将我的领域事件映射到更多的corase集成事件。但我可能仍然需要对它们进行测试的方法:)
UPDATE2:经过一些咨询后,一个想法出现了。假设我们坚持集成事件的概念。此类事件可以被视为类型和事件 ID。所以外部监听器只关注事件类型。如果事件发生,那么侦听器将被提供事件 ID。这使侦听器能够从给定版本的流/总线/wtf 中获取真实事件。$eventsStore->get($eventGuid, $eventType, 'v27')
例如(PHP 语法)