我正在寻找一种合理快速的Java事件处理机制来生成和处理在不同主机上运行的不同JVM上的事件。
对于单个JVM中多个线程的事件处理,我发现了一些像Jetlang这样的好候选者。但是在我搜索分布式的等价物时,我发现任何轻量级的东西都不能提供良好的性能。
有没有人知道任何适合该法案的实施?
修改 使用数字来表示性能有点困难。但是,例如,如果使用事件实现心跳机制并且心跳间隔为5秒,心跳接收器应该在一两秒钟内接收发送的心跳。
通常,轻量级实现提供了良好的性能。涉及Web服务器或任何类型的集中式集线器的事件处理机制需要强大的硬件(绝对不是轻量级)以提供良好的性能,这不是我正在寻找的。
答案 0 :(得分:8)
Hazelcast主题是一个分布式的pub-sub消息传递解决方案。
public class Sample implements MessageListener {
public static void main(String[] args) {
Sample sample = new Sample();
Topic topic = Hazelcast.getTopic ("default");
topic.addMessageListener(sample);
topic.publish ("my-message-object");
}
public void onMessage(Object msg) {
System.out.println("Message received = " + msg);
}
}
Hazelcast还支持分布式队列,地图,集合,列表上的事件。所有活动也都是订购的。
此致
-talip
答案 1 :(得分:4)
根据您的使用情况,Terracotta可能是一个很好的选择。
答案 2 :(得分:3)
AMQP(高级消息队列协议) - 更多详细信息: http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol可能就是你要找的东西。
金融服务公司将其用于高性能要求 - apache已实施 - http://cwiki.apache.org/qpid/
OpenAMQ - http://www.openamq.org/是较早的参考实现。
答案 3 :(得分:3)
对于分布式事件处理,您可以使用Esper。它可以在双CPU 2GHz基于Intel的硬件上处理高达500 000个事件/秒。由于许多银行使用此解决方案,因此非常稳定。它支持基于Spring JMS模板的JMS输入和输出适配器。因此,您可以使用任何JMS实现进行事件处理,即ActiveMQ。
答案 4 :(得分:2)
ZeroMQ - http://www.zeromq.org/
虽然这是一个传输层,但它可以为事件处理量身定制。
答案 5 :(得分:1)
无论您使用哪种工具,我都建议您从应用程序逻辑中隐藏中间件API。例如,如果您使用Apache Camel approach to hiding middleware,则可以根据您的具体要求轻松地从AMQP切换到SEDA到JMS到ActiveMQ到JavaSpaces到您自己的自定义MINA传输。
如果你想使用消息代理,我建议使用Apache ActiveMQ,这是最流行和最强大的开源消息代理,Apache和largest most active community behind it内都有outside it。< / p>
答案 6 :(得分:1)
看看akka(http://akka.io/)。它提供了一个分布式actor模型,与jlang的erlang同样具有java和scala API。
答案 7 :(得分:1)
您需要在java中为分布式事件处理实现Observer Design pattern。我使用事件流使用MongoDB上限集合和Observers来实现这一点。
您可以创建一个体系结构,其中触发器在封顶集合中发布文档,并且您的观察者线程使用tailable游标等待它。 如果您不理解我上面所说的内容,您需要刷新MongoDB和java skills
答案 8 :(得分:0)
如果JMS implementation不适合您,那么您可能会对XMPP方法感兴趣。有多个实现,还有Publish-Subscribe extension。
答案 9 :(得分:0)
Avis event router可能适合您的需求。它足够快,可用于近实时事件传递,例如发送用于远程鼠标控制的鼠标事件(我们每天使用它的应用程序)。
Avis还用于聊天,虚拟存在和智能房间自动化,其中通常有10-20台计算机通过基于Avis的消息总线进行通信。其商业表兄(Mantara Elvin)用于大批量商业贸易活动处理。