有什么区别:
可以是异步和非阻塞(以及基于事件的)吗?
在编程中最重要的是拥有一些东西:异步,非阻塞和/或事件库(或全部3)?
如果你能提供一些例子,那就太棒了.
这个问题正在被问到,因为我正在阅读关于类似主题的这篇伟大的StackOverflow文章,但它没有回答我上面的问题.
asynchronous programming-languages event-based-programming nonblocking blocking
我有一个基于服务的应用程序,它使用具有多个队列和多个消费者的Amazon SQS.我这样做是为了实现基于事件的体系结构并解耦所有服务,其中不同的服务对其他系统的状态变化做出反应.例如:
我有很多问题:
我想我的问题是:我应该使用哪些模式来确保我可以在SQS中为单个队列拥有多个使用者,同时确保消息也可以被可靠地传递和删除.谢谢您的帮助.
event-based-programming amazon-sqs amazon-web-services microservices
事件MPM与Nginx的设计并不完全相同,但显然旨在使Keepalive更加稳定并更快地发送静态文件.我的理解是事件MPM有点用词不当,因为:
不幸的是,Apache一直在失去市场份额,大多数基准测试都是MPM事件的诅咒.基准测试是否存在缺陷,或者事件MPM对Nginx的影响是否真的如此糟糕?即使有这些限制,在正常流量(非恶意)和较小的文件下,它应该与Nginx有一定的竞争力.例如,它应该在慢速连接上通过php-fpm为PHP生成的文档提供竞争,因为文档将被缓冲(即使是ssl'd和gzip)并且是异步发送的.使用压缩或不使用压缩的SSL和非SSL连接的工作方式与Nginx在此类工作负载上的工作方式不同.
那为什么它不会在各种基准测试中闪耀?它出什么问题了?或者基准测试有什么问题?是一个主要的网站使用它作为它可以执行的权威的诉求?
在微服务架构的背景下,消息驱动,异步,基于事件的设计似乎越来越受欢迎(参见此处和此处的一些示例,以及Reactive Manifesto - 消息驱动特性)而不是同步(可能是REST)基于)机制.
考虑上下文并想象一个过度简化的订购系统,如下所示:
和以下消息流程:
CreateOrderEventCreateOrderEvent,做一些库存InventoryUpdatedEvent事务并在完成时发布InventoryUpdatedEvent,发送发票并发布EmailInvoiceEvent所有服务都很好,我们很乐意处理订单......每个人都很高兴.然后,库存服务由于某种原因而下降
假设事件总线上的事件流向"非阻塞"庄园.即消息被发布到一个中心主题,并且如果没有服务正在从中读取消息,则不会堆积在队列中(我想要传达的是事件总线,如果事件在总线上发布,它将会流"直通"而不排队 - 忽略此时使用的消息平台/技术).这意味着如果库存服务停机5分钟,那么CreateOrderEvent在此期间通过事件总线的现在已经"消失"或者没有被库存服务看到,因为在我们过度简化的系统中,没有其他系统感兴趣那些事件.
我的问题是:库存服务(以及整个系统)如何以不丢失/未处理订单的方式恢复状态?
messaging event-based-programming reactive-programming microservices
我有n(通常n <10但应该扩展)进程在不同的机器上运行并使用RabbitMQ通过amqp进行通信.进程通常是长时间运行的,可以用任何语言实现(尽管大多数是java/python).
每个过程都需要许多输入(数字/字符串)并产生许多输出(也只是数字或字符串).执行进程是异步发生的:在其输入队列上发送消息并等待输出队列触发回调.
理想情况下,用户指定一些输入和所需的输出,系统应该:
如果节点的输入就绪,节点应该触发,允许每个分支并行.我现在可以假设没有循环,但最终会有循环(例如,两个进程可能需要迭代直到输出不再变化).
这应该是(数据)流程编程(之前讨论过)的已知问题,我想避免重新发明轮子.我更喜欢python解决方案,搜索引导Trellis和Pypes.Trellis不再开发,但似乎支持周期,而pypes则不支持.也不确定pypes是如何积极开发的.
进一步的搜索揭示了基于事件的编程框架的完整列表,其中没有一个我特别了解.当然有像Taverna和KNIME这样的工作流程环境,但这似乎有些过分.
有没有人有解决这类问题或提到的图书馆的经验?
编辑:我发现的其他库是:
在vert.x中,我可以向另一个Verticle发送消息并"异步等待"以进行回复.
问题是:我想向多个Verticle发送消息,并在所有Verticle回复时调用异步处理程序.
这是可能的还是有更好的设计来实现这个功能?
编辑:
我有一个垂直A,它发送消息到Verticle B,C和D.每个Verticle(B,C,D)对消息做一些事情并返回一些数据.然后,垂直A接收来自B,C,D的响应,并对所有数据执行某些操作.问题是我为每个发送的消息都有一个处理程序(一个用于A,一个用于B,一个用于C),我希望在所有回复到达时调用一个处理程序.
我正在写一个网络应用程序.
消息通过传输方式发送:
Network.SendMessage (new FirstMessage() );
Run Code Online (Sandbox Code Playgroud)
我可以注册一个事件处理程序,当这个消息类型到达时调用,如下所示:
Network.RegisterMessageHandler<FirstMessage> (OnFirstMessageReceived);
Run Code Online (Sandbox Code Playgroud)
事件被解雇了:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
}
Run Code Online (Sandbox Code Playgroud)
我正在为我的网络应用程序编写自定义身份验证过程,这需要大约五条消息才能完成.
不使用任务并行库,我将被迫编写前面的事件处理程序中的每个过程的下一步,如下所示:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
Network.SendMessage( new SecondMessage() );
}
public void OnSecondMessageReceived(EventArgs<SecondMessageEventArgs> e)
{
Network.SendMessage( new ThirdMessage() );
}
public void OnThirdMessageReceived(EventArgs<ThirdMessageEventArgs> e)
{
Network.SendMessage( new FourthMessage() );
}
public void OnFourthMessageReceived(EventArgs<FourthMessageEventArgs> e)
{
// Authentication is complete
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢跳过源代码来编写部分内容和部分内容的想法.这很难理解和编辑.
我听说任务并行库大大简化了这个解决方案.
但是,我使用任务并行库读取的许多示例都与启动一系列活动任务有关.我所说的' 主动 '是指每个任务都可以在明确调用时启动,如下所示:
public void Drink() {}
public void Eat() {}
public void Sleep() {}
Task.Factory.StartNew( () => …Run Code Online (Sandbox Code Playgroud) c# asynchronous event-based-programming task-parallel-library
我编写了一个高吞吐量服务器,它在自己的线程中处理每个请求.对于进入它的请求,有时需要对一个或多个后端执行RPC.这些后端RPC由一个单独的队列和线程池处理,它提供了对创建的线程数和后端最大连接数的一些限制(它执行一些缓存以重用客户端并节省开销不断创造联系).完成所有这些后,我开始认为基于事件的架构会更有效率.
在搜索时我没有发现任何与Java相关的等价物,但也许我不是在寻找正确的地方?来自Apache的Mina-statemachine是我发现的最接近的东西,但它看起来比我需要的更冗长,并且没有真正的版本可用.
有什么建议?
您好,我想使用 C# 实现基于事件的异步模式。下面的 Microsoft 文档确实很有帮助,但它忽略了实现细节,这是正确的。
http://msdn.microsoft.com/en-us/library/ms228969.aspx
实施此模式有哪些选择?我应该使用 Delegate.BeginInvoke、ThreadPool.QueueUserWorkItem、new Thread()、BackgroundWorker 类还是其他类?
我正在创建一个简单的代码库。它应该可以在 Windows 窗体、控制台应用程序或 ASP.NET 上下文中使用。
很高兴看到一些示例代码。
我需要一个基于事件的服务器,可以轻松地将数据推送到客户端。正如我在论坛中读到的,基于 websocket 的服务器是我最好的选择。请解释一下它的工作原理以及它在生产盒上的使用稳定性如何?
我对基于事件的编程很陌生。我正在尝试使用epoll的边缘模式,该模式显然仅信号通知已准备好进行读/写的文件(而不是级别模式,该信号通知所有就绪文件,无论是否已经就绪或刚刚就绪)。
对我来说还不清楚的是:在边缘模式下,我是否得知我不epoll_wait读书时发生的准备事件?尚未恢复的单发文件事件如何处理?
为了说明我为什么要问这个问题,请考虑以下情形:
epoll_ctl为在边缘模式+ oneshot中准备好读取套接字时做出反应:EPOLLET | EPOLLONESHOT | EPOLLINepoll_wait 要发生的事情(最多报告10个事件)read并处理数据套接字#1(直到E_AGAIN)read并处理数据套接字2(直到E_AGAIN)epoll_ctlin EPOLL_CTL_MOD模式重新触发了文件epoll_wait下一批事件好吧,那么是否epoll_wait 总是会通知套接字S已准备就绪?如果S为#1(即不重新设置),是否会发生事件?
堆栈溢出!
我正在寻找一种方法来使用PHP创建类似插件(我不知道如何调用它)的Web应用程序.有了这个,我的意思是我想建立一个系统,用户可以通过浏览器添加/删除插件(扩展,如果你喜欢)(而不是通过添加一些代码来配置).在我看来,WordPress就是一个很好的例子.最终用户可以简单地安装任何类型的插件,并且几乎不做任何事情,他们按预期工作,并且经常有很多设置需要更改,等等.
此外,我希望尽可能使它成为可用.有了这个,我的意思是插件可以使用其他插件的一部分,因此重写的代码更少.例如,有用于授权/身份验证的插件以及与用户相关的所有其他内容.然后,有一个用于博客的插件.博客,当然,之前需要提到,对吗?所以它只是使用前面提到的插件来工作.我知道会有很多依赖等等......但它只是正常的.:)
我的问题是......我能用什么技术来完成它?这种系统的优点和缺点是什么?我认为它会慢一些,不适合像Facebook这样的大型网站(好吧,那太大了),但对于简单的博客,投资组合,不管它会不会很好!
我听说过事件驱动编程(或基于事件的编程),我在维基百科上读过关于它的文章,但仍然......我很困惑,甚至更多,不确定它是我的东西寻找.
感谢您阅读本文.如果可能的话,给我一些答案.:d
我最近看了Trygve Reenskaug在DCI上发表的以下演讲:https ://vimeo.com/43536416 这真让我大吃一惊 。嗯,在代码中看到软件的不同组件之间的交互是一个很有吸引力的想法。
我试图在javascript中找到DCI的示例,但未成功。然后我开始怀疑。DCI模式是否与事件编程模式相反?
我猜事件编程在javascript中是新潮,因为它允许解耦,并且因为经典继承概念不是js固有的。我想我了解事件编程的好处,但是我也注意到,当调试需要遵循事件消息时,调试可能会非常困难。
说两个概念都对吗正确吗?还是我弄错了?我错过了js中DCI的一些示例实现吗?为了理解这个概念,我应该看什么?
javascript model-view-controller design-patterns event-based-programming dci
asynchronous ×4
c# ×2
java ×2
php ×2
amazon-sqs ×1
amqp ×1
apache ×1
blocking ×1
dci ×1
epoll ×1
epollet ×1
frameworks ×1
javascript ×1
libevent ×1
linux ×1
messaging ×1
nginx ×1
nonblocking ×1
plugins ×1
python ×1
scheduling ×1
vert.x ×1
webserver ×1
websocket ×1
workflow ×1