免责声明:我不是一名实时架构专家,我只想抛出一些个人考虑因素并评估其他人的建议或指出.
让我们想象一下,我们想要设计一个实时分析系统.下面,Lambda架构Nathan Marz的定义,为了服务数据,我们需要一个批处理层(即Hadoop),从所有数据的数据集连续重新计算视图,以及所谓的速度层(即Storm)不断处理视图的子集(由批处理层的最后一次完全重新计算后进入的事件产生).您可以通过将两者的结果合并在一起来查询系统.
这种选择背后的基本原理对我来说非常有意义,它结合了软件工程和系统工程观察.拥有不断增长的不可变时间戳事实的主数据集使得系统在计算视图时可以抵御人为错误(如果您执行了错误,只需修复它并在批处理层中重新计算它们)并使系统能够回答几乎任何问题.查询将来会出现.此外,此类数据存储区仅需要支持随机读取和批量插入,而速度/实时部分的数据存储区则需要有效支持随机读取和随机写入,从而增加其复杂性.
我对此讨论的反对/触发因素是,在某些情况下,这种方法可能过度.为了便于讨论,假设我们做了几个简化:
系统仍然需要可扩展,并处理不断增加的流量和数据.鉴于这些观察结果,我想知道是什么阻止我们设计一个完全面向流的架构.我想象的是一个体系结构,其中事件(即页面视图)被推入流中,可能是RabbitMQ + Storm或Amazon Kinesis,并且这些流的消费者将通过随机写入/更新来直接更新所需的视图. NoSQL数据库(即MongoDB).
在第一次近似中,我认为这种架构可以水平扩展.Storm可以集群化,而Kinesis预计QoS也可以预先保留.更多的传入事件将意味着更多的流消费者,并且因为它们是完全独立的,所以没有什 关于数据库,使用适当的策略对其进行分片将使我们将越来越多的写入分发给越来越多的分片.为了避免读取受到影响,每个分片可以有一个或多个只读副本.在可靠性方面,Kinesis承诺可靠地存储您的消息长达24小时,并且正确使用确认机制的分布式RabbitMQ(或您选择的任何队列系统)可能满足相同的要求.
故意(我相信)亚马逊关于Kinesis的文档避免将您锁定在特定的架构解决方案中,但我的总体印象是,他们希望推动开发人员简化Lambda架构并获得类似于我的完全基于流的解决方案.暴露了.为了更加符合Lambda体系结构的要求,没有什么能阻止我们与消费者不断更新我们的视图并行,一组处理传入事件并将它们作为原子不可变单元存储在不同数据存储区中的消费者.在将来用于生成新视图(例如通过Hadoop)或重新计算错误数据.
你对这个推理有什么看法?我想知道在哪些场景中纯粹基于流的架构无法扩展,如果你有任何其他观察,那么Lambda架构的vs\cons与基于流的架构相比.
hadoop scalability amazon-kinesis lambda-architecture apache-storm
想象一下,您有一个由不同组件构成的相当复杂的面向服务的体系结构.组件使用不同的语言(Java,PHP,Ruby)编写,并以不同的方式相互通信(即UI,REST API,在某些情况下共享一些DB表等).
我正在尝试为一些端到端测试设计集成测试框架.我们已经对单个组件进行了单元/集成测试,但是我们希望构建一些能够端到端地完全测试我们部署的系统(在真实环境中)的东西,以确保功能(就个人的预期行为而言)组件正确提供,并且架构也正确配置.
我面临的第一个问题是我们的大多数UI都是用PHP编写的,并且已经使用Cucumber和顶部的几个插件为它编写了UI集成测试.我正在编写的测试框架(Java)应该触发这些功能测试,然后检查相关组件的行为是否符合预期.
显然,我可以使用像Selenium这样的Java友好组件重写UI测试,但复制工作没有意义.
另一个解决方案是在Java中使用exec()调用运行现有测试,等待它们返回,可能解析输出并继续执行需要执行的其他操作/检查.
考虑到项目的编写方式,在Java中嵌入现有的PHP代码似乎不是一个可行的解决方案.
所描述的解决方案都没有让我觉得有说服力.理想情况下,拥有某种多语言(和多技术)集成框架会很好,这种集成框架可以插入用不同语言和不同环境/组件编写的相同测试套件测试中.
有没有人知道朝这个方向发展的工具或框架?如果没有,对这类问题有什么好处?
我正在努力解决我无法解决的 Java/Maven/Jetty 问题。我有一个 Java Jetty 服务器可以正确启动,但是一旦向它发送 HTTP 请求,它就会中止显示此堆栈跟踪:
2013-09-30 08:40:24,534 [qtp297240915-11 Selector0] WARN org.eclipse.jetty.io.nio - java.lang.SecurityException: class "javax.servlet.AsyncContext"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:806) ~[na:1.6.0_37]
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:487) ~[na:1.6.0_37]
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:625) ~[na:1.6.0_37]
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) ~[na:1.6.0_37]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) ~[na:1.6.0_37]
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) ~[na:1.6.0_37]
at java.net.URLClassLoader.access$000(URLClassLoader.java:58) ~[na:1.6.0_37]
at java.net.URLClassLoader$1.run(URLClassLoader.java:197) ~[na:1.6.0_37]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_37]
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) ~[na:1.6.0_37]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) ~[na:1.6.0_37]
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ~[na:1.6.0_37]
at org.eclipse.jetty.server.AbstractHttpConnection.<init>(AbstractHttpConnection.java:157) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.server.AsyncHttpConnection.<init>(AsyncHttpConnection.java:50) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.server.nio.SelectChannelConnector.newConnection(SelectChannelConnector.java:285) …Run Code Online (Sandbox Code Playgroud)