我们正在开发一个基于Java的系统,我们正在寻找随着应用程序而增长的最佳设计模式,即使在时间过程中会添加更多模块 目标是:
模块化,其中核心模块和其他模块将继承基本功能。
然后其他模块是单独的组件,但在其他模块之间共享数据
例如,学生将被分配,付款,论坛,课程,如果是一般客户付款,购物等。如果学生想要购物,您升级他的帐户并将购物模块添加到他和他的帐户中,更新课程以显示他买了一本书,例如“Java中的Concurreny”。
哪种最适合我们的设计模式?您建议的任何建议或我可以查看的材料?
我们如何实现数据库设计几乎完美?你可能有的参考资料?
任何更多的建议都会被接受并受到欢迎。
答案 0 :(得分:1)
我过去取得过成功的模块化模式是消息总线。基本上,学生(或教授或管理员等)不直接与付款或论坛或课程等模块交谈,而是通过消息总线完成所有通信(例如,学生向总线发送消息,发送给论坛的消息)。此消息总线可以是ConcurrentLinkedQueue或LinkedBlockingQueue,也可以是第三方软件,例如RabbitMQ或ActiveMQ或Amazon SQS;每个都有它的优点和缺点,你需要权衡,但你并没有完全锁定你的决定 - 我参与了一个项目,我们从亚马逊SQS切换到RabbitMQ,我的工作重写消息格式并不复杂。
关于消息的好消息:
稳健性。如果您使用持久队列(意味着将消息保存到数据库),那么您可以承受程序崩溃,同时最大限度地减少数据丢失。此外,客户端模块(学生/教授/管理员),服务模块(支付,论坛,课程)和消息总线通常在不同的内存空间中运行(它们各自都有自己的线程池,数据在它们之间复制而不是直接在它们之间共享),所以如果一个模块崩溃,它就不会把其他模块用掉它(除非它崩溃的消息总线,在这种情况下其他模块仍然完好但是它们&# 39;必须旋转/睡觉直到公共汽车重新上线。
可扩展性。并发和分布式系统通常建立在消息传递模型上;例如,消息传递是并发语言和Erlang和Akka等库的固有部分。如果你不小心,消息总线将成为一个瓶颈,但如果你不相信自己很好地实现它,那么有几个很好的第三方库可供选择。
模块化。如果您想添加一个新模块,那么您只需要编写它以与您的消息总线进行互操作 - 您不需要编写单独的接口来与所有其他模块进行通信。删除模块同样容易 - 只需让消息总线将其消息路由到死信存储。访问控制之类的东西很容易通过消息总线实现 - 如果学生无法访问Admin模块,那么消息总线只会将错误的消息路由到死信存储或异常队列。
消息传递的主要缺点是其效率 - 模块通过复制数据而不是通过授予直接访问来进行通信。但是,从长远来看,您会发现这将使使用多线程实现模块变得更加容易,这可能会带来净效率提升。