我正在开发一个多层软件解决方案,其中我有一个服务器,n瘦客户端引擎(TCE)和m瘦客户端在最基本的水平。我计划使用许多其他组件来实现可伸缩性,其中可以为拥塞添加额外的组件,但这些组件是基本组件。
当我最初设计解决方案时,我创建了自己的命令协议,用于服务器和TCE以及TCE和使用JSON的瘦客户机之间的通信。我开始开发数据集和数据传输,而不仅仅是消息。该应用程序可以轻松地容纳100 to的数据,而且由于它是内存中的解决方案(仅用于持久性的数据库),所以我需要在不同层之间封送数据,并处理增量传输(所有数据都在同一个网络上,但硬件不同)。我很快意识到,我需要编写的所有同步逻辑都将是巨大的,所以我决定退一步,在我做得太过火之前,考虑一下这个问题。
由于我是唯一的开发人员,我一直在寻找方法,以尽量减少努力,以便我可以完成更多。我决定转换到Java内置序列化,因为我的组件的数据集版本是100%的Java。在做完这些和测试之后,我显然遇到了很多可以序列化的错误。正如您可能知道的,您想要放置在对象流中的任何类实例都需要实现可序列化接口。当我试图传递一个对象时,我意识到这个图形非常大。这意味着我需要修改所有在层之间使用的类,使其可序列化,并且只将服务器字段标记为瞬态字段。这也是很多工作。
所以我想问问社区,他们认为最好的设计应该在这里。我使用Java序列化的意图是,我可以分配一个要传输的根对象,并且所有与下游相关的东西也会被发送,这使我非常容易。另外,对于增量处理,这可以使作为开发人员的我更容易,因为我不必编写几乎同样多的数据同步逻辑。
我想要达到的目标是,一种只需对层间使用的所有类进行最小修改的解决方案,以及一种可伸缩的解决方案。
我查看了google的协议缓冲区,但这更适合我的瘦客户端通信,因为我将拥有一个Java瘦客户机、Web客户端和Mobile客户机。
发布于 2019-01-01 06:30:47
我建议您使用类似于ProtocolBuffers或Apache的方法,这样您就可以简单地定义数据,并且您的数据与语言实现没有关联。这是一个很大的系统,以后您可能希望单独实现某个部分,或者您可能希望进行架构更改。使用可移植的数据序列化库,您可以更容易地隔离数据存储。
发布于 2017-11-23 17:02:31
除了100 GiB,你没有给我们任何规格。特别是,您主要关心的是延迟还是吞吐量?
这里有一件最简单的事情,可能适用于这样模糊的规格:坚持一切,把它当作真理之源。然后传递句柄,因此您的(小的、可序列化的)对象本质上是指向持久化数据结构的指针。你提到了计算三角洲。您可能会发现,将“处理”大型对象看作是“计算要应用于该对象之上的增量”是很方便的。当您写入仅附加的对象存储并积累增量描述符以修改您对演变中对象的解释时,不需要“同步”。
顺便说一句,java的序列化支持对于某些项目来说是很方便的,但是内省会减慢它的速度。Avro和其他人为更快、更紧凑的方法指明了方向。
https://softwareengineering.stackexchange.com/questions/342635
复制相似问题