标签: system-design

设计一个基于插件的java应用程序

我正在尝试制作一个基于插件的应用程序,这意味着除了基本框架之外,还应该使用插件样式添加其他功能。

我认为这种系统的主要问题是如何在运行时加载新插件。我不想在安装新插件时重新编译整个项目。就像Eclipse一样,全新安装插件后,用户只需重启即可。所以我的第一个想法是使用 java 反射在运行时加载类。可能有一些插件配置文件,系统读取它们并通过反射加载插件类。也许我也可以使用 spring 框架,因为它的控制反转正好符合我的要求。

我正在研究的另一个想法是使用 ejb 容器。当插件是 ejb 时,我可以将它们打包成 jar 并将它们部署在 ejb 容器中,然后我可以使用 jndi 访问它们。但它只在插件是 ejbs 时有效。

反正我是系统设计的菜鸟。所以我发布了这个话题,想听听你的意见。顺便提一句。有什么关于系统设计的好书要推荐吗?

非常感谢!

java plugins spring system-design

5
推荐指数
1
解决办法
657
查看次数

设计 - 如何处理时间戳(存储)以及何时执行计算;Python

我正在尝试确定(因为我的应用程序正在处理来自不同来源和不同时区、格式等的大量数据)如何最好地存储我的数据并使用它。

例如,我应该将所有内容存储为 UTC 吗?这意味着当我获取数据时,我需要确定它当前所在的时区,如果它不是 UTC,则进行必要的转换以使其如此。(注意,我在 EST)。

然后,在对数据执行计算时,我是否应该提取(假设它是 UTC)并进入我的时区 (EST),以便我查看它时有意义吗?我应该将其保留在 UTC 中并进行所有计算吗?

很多这些数据是时间序列,将被绘制成图表,图表将在 EST 中。

这是一个 Python 项目,所以假设我有一个数据结构:

"id1": {
    "interval": 60,                            <-- seconds, subDict['interval']
    "last": "2013-01-29 02:11:11.151996+00:00" <-- UTC, subDict['last']
},
Run Code Online (Sandbox Code Playgroud)

我需要对此进行操作,通过确定当前时间 (now()) 是否 > 最后一个 + 间隔(60 秒已经过去)?所以在代码中:

lastTime = dateutil.parser.parse(subDict['last'])    
utcNow = datetime.datetime.utcnow().replace(tzinfo=tz.tzutc())

if lastTime + datetime.timedelta(seconds=subDict['interval']) < utcNow:
    print "Time elapsed, do something!"
Run Code Online (Sandbox Code Playgroud)

那有意义吗?我在任何地方都使用 UTC,无论是存储还是计算......

另外,如果有人有关于如何在软件中使用时间戳的好文章的链接,我很乐意阅读它。可能像 Joel On Software 用于在应用程序中使用时间戳?

python architecture datetime design-patterns system-design

5
推荐指数
1
解决办法
1784
查看次数

好的系统设计播客

我一直在阅读https://www.hiredintech.com。他们教系统设计。有人知道涵盖系统设计的播客吗?我想讨论一些话题,例如:

  • MongoDB与Neo4j的比较
  • AWS Lambda
  • 扩展Rails与扩展Node.js的比较
  • 蔚蓝
  • GlusterFS
  • 使用Docker进行HA
  • 等等

谢谢。

podcast system-design

5
推荐指数
0
解决办法
670
查看次数

设计 Facebook 规模的信使/聊天服务器

我发现一些文章概述了 facebook Messenger 的架构,但我想深入了解。

信使架构

这是我所知道的一些事情(如果我错了请纠正我)

  • 当发送者发送消息时,我们需要将消息存储在一些持久数据存储中,如果接收者当时在线,我们需要将这些消息发送给接收者。这应该无缝地发生,即接收者不应该轮询新消息

这是我的一些想法

想法 1 - 在应用程序服务器内部,我们将为每个接收者维护一个通道,将与该接收者相关的所有新消息推送到该通道中,从该通道读取并将其推送到客户端。

我们如何维护每个发送者/接收者线程(即对话)接收到的消息?

想法 2 - 在应用程序服务器内部,我们将为每个发送者-接收者组合(即对话)维护一个通道,并从所有接收者通道读取数据并将其推送到客户端。

我们如何处理每个接收器的这么多通道?

这是我的几个问题

应用服务器堆栈

  • 如果收件人在线,如何直接转发消息?
  • 如何维护同一接收者的多个客户端,即接收者是否通过移动应用程序、网络浏览器登录。如何将消息转发给所有客户端?
  • 如何在应用服务器中保持连接,以便应用服务器有消息时会推送消息,而不是客户端不断轮询服务器?
  • 我们如何维护每个对话的标记为已读功能?
  • 如何在接收者上线时推送接收者所有未读消息?
  • 如何高效地获取对话历史记录?
  • 如何扩展到数百万个发送者/接收者?

持久数据存储

  • 最适合聊天类应用程序的数据存储是什么?
  • 数据的存储格式是什么?

如果您想投反对票,请评论原因

architecture chat system-design messenger facebook-messenger

5
推荐指数
0
解决办法
1579
查看次数

为什么说锁违反了抽象和可组合性原则?

我没有在 Google 甚至 StackOverflow 上找到任何明确的答案来回答这个问题。

根据我的理解

  • 使用锁的线程会破坏抽象
  • 锁是不可组合的

但是锁如何以及为什么会破坏抽象和可组合性呢?

abstraction system-design locks

5
推荐指数
1
解决办法
551
查看次数

系统设计和面向对象设计之间的区别

有人可以解释一下系统设计和面向对象设计之间的区别吗?

面向对象的设计涉及对象建模,并使用诸如抽象,封装,分解和概括之类的面向对象的概念。这两个设计都涉及建筑设计和概念设计。

是其他设计范式的子集之一吗?

architecture oop system-design object-oriented-analysis object-object-mapping

5
推荐指数
2
解决办法
3401
查看次数

使用消息队列的微服务架构和事件驱动架构一样吗

编辑 v1:我一直在浏览一些系统设计视频,并了解使用消息队列和事件驱动架构的微服务架构

但我似乎没有发现两者之间有任何实质性的区别。这两个具有不同的部件/服务发布或订阅eventBus / messagingQueues并执行与公布的事件相关的任务。

带有消息队列的微服务架构是事件驱动架构的一个子集,还是我需要弄清楚的更多内容。


原文V0:我一直在浏览一些系统设计视频,了解微服务架构事件驱动架构

但我似乎没有发现两者之间有任何实质性的区别。这两个具有不同的部件/服务发布或订阅eventBus / messagingQueues并执行与公布的事件相关的任务。

微服务架构是事件驱动架构的一个子集,还是我需要弄清楚的更多内容。

event-driven-design system-design microservices

5
推荐指数
0
解决办法
1391
查看次数

直接从移动应用程序或通过后端服务器访问 firestore?

系统设计问题:

我在我的移动应用程序中使用 firebase,以 firestore 作为数据库,以 firebase 函数作为后端。

我是否:

  1. 直接从移动应用程序访问 firestore
  2. 只允许通过中间件/后端服务器间接访问(例如 firebase 函数)

我正在从系统设计的角度寻求指导,两种选择中哪一种更好。传统上,我认为直接从客户端访问数据库会让人皱眉,但在官方 firestore 文档中,谷歌似乎实际上鼓励直接访问,而不需要任何后端服务器。

architecture model-view-controller system-design firebase google-cloud-firestore

5
推荐指数
1
解决办法
2401
查看次数

面向对象的设计来建模通用设备

在一次采访中,我被问到以下面向对象的系统设计问题。

有多种设备,如 Echo show、Echo dot、Echo tab、智能微波炉、Fire 电视棒等。

  • 回声秀 - 它有显示屏和扬声器。它在电力供应下工作。
  • 回声点 - 它有扬声器。它依靠电力供应工作。
  • 回声选项卡 - 它有扬声器。它依靠电池供电工作。电池可以充电。
  • 智能微波炉 - 有屏幕显示。它依靠电力供应工作。
  • 消防电视棒 - 它有扬声器。它依靠电力供应工作。

所以基本上有 3 个类别,例如 - 扬声器/屏幕显示/扬声器和屏幕显示。还有两个类别,例如 - 电源/电池供电。可以对任何这些设备进行查询,例如打印状态。以下是每个设备的可能输出 -

  • Echo 显示 - “正在充电”或“未充电”,具体取决于是否连接到电源。该输出应该出现在屏幕和扬声器上。
  • 回声点 - “正在充电”或“未充电”,具体取决于它是否连接到电源。该输出应该来自扬声器。
  • Echo 选项卡 - “电池正在充电”或“电池未充电且电池电量为 70%”,具体取决于电池是否正在充电。该输出应该来自扬声器。
  • 智能微波炉 - “正在充电”或“未充电”取决于它是否连接到电源。该输出应该出现在屏幕上。
  • Fire 电视棒 - “正在充电”或“未充电”,具体取决于它是否连接到电源。该输出应该来自扬声器。

假设有用于在屏幕上说话和打印的内置类。如果我们将字符串传递给这些类对象,它们将执行各自的工作。

现在编写 4-5 个类来模拟此场景。

设计应该是可扩展的,这意味着如果明天任何新设备带有新的组合,那么它可以在不创建任何新类的情况下实现。所以你不应该为每个设备创建类。

这是我的面向对象的解决方案,但面试官对此并不满意,尤其是vector<Output*> outputs. 他建议使用一些设计模式而不是矢量。你能想出更好的解决方案吗?

class Output {
   public:
    virtual void print(string);
};
class Display : public Output {
    DisplayScreen obj;
   public:
      void print(string str) { …
Run Code Online (Sandbox Code Playgroud)

c++ oop design-patterns system-design object-oriented-analysis

5
推荐指数
1
解决办法
343
查看次数

将任务添加到 RabbitMQ 消息队列时 Django celery 错误:AttributeError: 'ChannelPromise' 对象没有属性 '__value__'

我在 digitalocean 上设置了 celery、rabbitmq 和 django Web 服务器。RabbitMQ 在另一台服务器上运行,我的 Django 应用程序未在该服务器上运行。当我尝试使用延迟将任务添加到队列时,出现错误

AttributeError:“ChannelPromise”对象没有属性“ value

从 django shell 中,我将任务添加到我的消息队列中。

python3 管理.py shell

Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from app1.tasks import add
>>> add.delay(5, 6)
Run Code Online (Sandbox Code Playgroud)

但出现错误

Traceback (most recent call last):
  File "/etc/myprojectenv/lib/python3.8/site-packages/kombu/utils/functional.py", line 30, in __call__
    return self.__value__
AttributeError: 'ChannelPromise' object has no attribute '__value__'

During handling of the above exception, another exception occurred: …
Run Code Online (Sandbox Code Playgroud)

python django rabbitmq system-design celery

5
推荐指数
1
解决办法
4580
查看次数