1

我们正在开发一个基于 Java 的系统,并且我们正在寻找将随着应用程序发展的最佳设计模式,即使随着时间的推移会添加更多模块,
目标是:

  • 有核心模块的模块化,其他模块将从那里继承基本功能。

  • 那么其他模块是单独的组件,但在其他模块之间共享数据

  • 在管理员方面,模块可以分配给某个用户

例如,学生会被分配,支付,论坛,课程,如果是一般客户支付,购物等。如果学生要购物,你升级他的账户并添加购物模块给他,在他的账户中,更新课程以表明他买了一本书,例如“Java 中的并发”。

  • 可以打开和关闭模块,而不影响应用程序的稳定性。
  • 由于内容的管理,我还考虑使用jackrabbit。我错了吗?正面和负面的参考?

哪种设计模式最适合我们?你有什么建议或者我可以看的材料吗?

我们如何才能将数据库设计实现得近乎完美? 你可能有参考资料?

任何更多的建议都将被接受并受到欢迎。

4

1 回答 1

1

我过去取得成功的一种模块化模式是消息总线。本质上,学生(或教授或管理员等)不直接与支付或论坛或课程等模块交谈,而是通过消息总线完成所有通信(例如,学生向总线发送消息,总线发送消息到论坛)。此消息总线可以是ConcurrentLinkedQueueLinkedBlockingQueue,也可以是第三方软件,例如RabbitMQActiveMQAmazon SQS; 每一个都有它的优点和缺点,你需要权衡,但你并没有完全锁定在你的决定中——我在一个项目中工作,我们从 Amazon SQS 切换到 RabbitMQ,我重写消息格式的工作是没那么复杂。

关于消息传递的好处:

  1. 稳健性。如果您使用持久队列(意味着将消息保存到数据库中),那么您可以以最小的数据丢失承受程序崩溃。此外,客户端模块(学生/教授/管理员)、服务模块(支付、论坛、课程)和消息总线通常在单独的内存空间中运行(它们每个都有自己的线程池,并且在它们之间复制数据而不是直接在它们之间共享),因此如果一个模块崩溃,它不会使其他模块随之崩溃(除非它是消息总线崩溃,在这种情况下,其他模块仍然完好无损,但它们必须旋转/睡眠直到总线重新上线)。

  2. 可扩展性。并发和分布式系统通常建立在消息传递模型之上;例如,消息传递是 Erlang 和 Akka 等并发语言和库的内在组成部分。但是,如果您不小心,消息总线将成为瓶颈,但是如果您不相信自己能够很好地实现它,那么有几个不错的第三方库可供选择。

  3. 模块化。如果你想添加一个新模块,那么你只需要编写它来与你的消息总线互操作——你不需要编写单独的接口来让它与所有其他模块通信。删除一个模块同样简单——只需让消息总线将其消息路由到死信存储。像访问控制这样的事情很容易通过消息总线实现——如果学生没有访问管理模块的权限,那么消息总线只会将错误消息路由到死信存储或异常队列。

消息传递的主要缺点是它的效率——模块通过复制数据而不是通过授予直接访问来进行通信。但是,从长远来看,您会发现这将使使用多线程实现模块变得更加容易,这可能会带来净效率增益。

于 2013-04-19T05:29:48.133 回答