我正在尝试制作一个基于插件的应用程序,这意味着除了基本框架之外,还应该使用插件样式添加其他功能。
我认为这种系统的主要问题是如何在运行时加载新插件。我不想在安装新插件时重新编译整个项目。就像Eclipse一样,全新安装插件后,用户只需重启即可。所以我的第一个想法是使用 java 反射在运行时加载类。可能有一些插件配置文件,系统读取它们并通过反射加载插件类。也许我也可以使用 spring 框架,因为它的控制反转正好符合我的要求。
我正在研究的另一个想法是使用 ejb 容器。当插件是 ejb 时,我可以将它们打包成 jar 并将它们部署在 ejb 容器中,然后我可以使用 jndi 访问它们。但它只在插件是 ejbs 时有效。
反正我是系统设计的菜鸟。所以我发布了这个话题,想听听你的意见。顺便提一句。有什么关于系统设计的好书要推荐吗?
非常感谢!
我正在尝试确定(因为我的应用程序正在处理来自不同来源和不同时区、格式等的大量数据)如何最好地存储我的数据并使用它。
例如,我应该将所有内容存储为 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 用于在应用程序中使用时间戳?
我一直在阅读https://www.hiredintech.com。他们教系统设计。有人知道涵盖系统设计的播客吗?我想讨论一些话题,例如:
谢谢。
我发现一些文章概述了 facebook Messenger 的架构,但我想深入了解。
这是我所知道的一些事情(如果我错了请纠正我)
这是我的一些想法
想法 1 - 在应用程序服务器内部,我们将为每个接收者维护一个通道,将与该接收者相关的所有新消息推送到该通道中,从该通道读取并将其推送到客户端。
我们如何维护每个发送者/接收者线程(即对话)接收到的消息?
想法 2 - 在应用程序服务器内部,我们将为每个发送者-接收者组合(即对话)维护一个通道,并从所有接收者通道读取数据并将其推送到客户端。
我们如何处理每个接收器的这么多通道?
这是我的几个问题
应用服务器堆栈
持久数据存储
如果您想投反对票,请评论原因
architecture chat system-design messenger facebook-messenger
我没有在 Google 甚至 StackOverflow 上找到任何明确的答案来回答这个问题。
根据我的理解
但是锁如何以及为什么会破坏抽象和可组合性呢?
有人可以解释一下系统设计和面向对象设计之间的区别吗?
面向对象的设计涉及对象建模,并使用诸如抽象,封装,分解和概括之类的面向对象的概念。这两个设计都涉及建筑设计和概念设计。
是其他设计范式的子集之一吗?
architecture oop system-design object-oriented-analysis object-object-mapping
编辑 v1:我一直在浏览一些系统设计视频,并了解使用消息队列和事件驱动架构的微服务架构。
但我似乎没有发现两者之间有任何实质性的区别。这两个具有不同的部件/服务发布或订阅到eventBus / messagingQueues并执行与公布的事件相关的任务。
带有消息队列的微服务架构是事件驱动架构的一个子集,还是我需要弄清楚的更多内容。
原文V0:我一直在浏览一些系统设计视频,了解微服务架构和事件驱动架构。
但我似乎没有发现两者之间有任何实质性的区别。这两个具有不同的部件/服务发布或订阅到eventBus / messagingQueues并执行与公布的事件相关的任务。
微服务架构是事件驱动架构的一个子集,还是我需要弄清楚的更多内容。
系统设计问题:
我在我的移动应用程序中使用 firebase,以 firestore 作为数据库,以 firebase 函数作为后端。
我是否:
我正在从系统设计的角度寻求指导,两种选择中哪一种更好。传统上,我认为直接从客户端访问数据库会让人皱眉,但在官方 firestore 文档中,谷歌似乎实际上鼓励直接访问,而不需要任何后端服务器。
architecture model-view-controller system-design firebase google-cloud-firestore
在一次采访中,我被问到以下面向对象的系统设计问题。
有多种设备,如 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
我在 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)