标签: system-design

什么时候在春天使用服务或组件?

什么时候在春天使用服务或组件?

例如,负责将电子邮件或公共业务逻辑发送为"服务"或"组件"的模块是什么?有什么区别?

服务是否能够呼叫其他服务?有交易问题吗?或者服务应该只调用组件?

有人告诉我,服务永远不应该调用其他服务,而应该只调用组件,这意味着Controller-> Service-> Component-> DAO,但是我发现很多人分享了Controller-> Service-> DAO的概念.没有组件.

Spring中是否有关于此主题的系统设计标准?

java spring system-design

10
推荐指数
2
解决办法
1万
查看次数

你如何在 Clean Architecture 中实现一对多的关系

我在使用 Clean Architecture 时遇到问题。对于那些阅读过 Fernando Cejas 的博客文章 http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ 的人,我的问题是基于它和他的代码。

他的示例项目只有一个域对象一个用户。POJO 的一切都一目了然。我遇到问题的地方是,假设用户有书。一对多的关系。您将如何在 Clean Architecture 中处理这个问题?

就像他一样,我有几个层,所以每个域对象(用户、用户模型、用户实体)有 3 个类,每个域对象(UserDataRepository)有一个存储库。我们的新示例还将包含 Book、BookModel、BookEntity 和 BookDataRepository。

我还有带有 CRUD 变体的用例类。

我的问题出在 UI/Presenter 级别。此时在程序中,我有一个 UserModel 对象和一个 BookModel 列表。我没有 userModel.getBooks()。我没有 userModel.save() (它也可以保存所有书籍更改)。

为了突出这个问题,为了让这个类比看起来更像我的实际用例,我还有书中所有页面的列表!:) 因此,当我保存用户时,我想保存到书籍中,以及可能已修改的每本书的所有页面。

我该怎么办?

第二个奖励问题:在我的现实问题中,我有从基类派生的类。使用上面的类比:LeftPage 和 RightPage 将派生自 PageBase。一本书有一个列表。但是 LeftPage 和 RightPage 都有各自的存储库、单独的用例等(但这不起作用)如何保存列表?我是否必须制作一个单独的用例 SavePages ,它会有一个:

if (pages.elementAt(i) instanceof LeftPage) { SaveLeftPage saveLeft = new ..... } else { SaveRightPage saveRight = new ..... }

我不认为我可以使用多态,因为在我看到的所有文档中,模型不知道用例。

我希望你能帮助,非常感谢你的时间:)

-麦克风

java android system-design

9
推荐指数
1
解决办法
1809
查看次数

如何实现撤消功能?

在我的应用程序中,我想为用户提供一个小的撤消功能.用户没有多少动作可以撤消.特别是行动是:

  • 添加注释到对象
  • 为对象着色
  • 使用字符串标记objcet

现在我想到了如何实现这一点.我首先想到的是一个Action类,它是用户可以采取的3种不同操作的抽象基类.每次用户执行这些操作时,都会创建此抽象Action类的子类的新适当实例,并将其插入包含所有操作的列表中.

每当用户想要撤消某些内容时,该列表将显示给用户,并且他可以选择要撤消的操作.

现在我在想什么必须存储在这样的动作对象中:

  • 在行动之前的对象的状态
  • 采取的实际操作(例如添加到对象注释中的字符串)

我不确定这是否足够.我还考虑过按时间顺序排序,但这应该是必要的,因为列表可以按时间顺序保持正确.

还有其他我应该考虑的事情吗?

.net c# architecture system-design

8
推荐指数
3
解决办法
7230
查看次数

访谈:系统/ API设计

这个问题是在一家大型软件公司中提出的.我想出了一个简单的解决方案,我想知道其他人对解决方案的看法.

您应该为系统设计API和后端,以便为居住在城市中的人分配电话号码.电话号码将从111-111-1111开始,到999-999-9999结束.API应该使客户(城市中的人)能够执行以下操作:

  1. 当客户请求电话号码时,它会向其分配一个可用号码.
  2. 有些客户可能需要花哨的数字,所以他们可以专门要求分配一个数字.如果请求的号码可用,则系统将其分配给它们,否则系统将分配任何可用的号码.

系统无需知道哪个号码分配给哪个客户端.同一个客户可以连续发出请求并为自己获取多个电话号码,但系统不会受到打扰.在任何时候,系统只知道分配了哪些电话号码以及哪些电话号码是免费的.

从111-111-1111到999-999-9999的数字大致相当于80亿个数字.假设内存不是约束,我可以想到以下两种方法(几乎相似).

  1. 维护一个长度为80亿的巨大布尔数组,并有一个next指向数组索引的指针(next初始化为零).如果指向的值next不是空闲的,则转发next直到找到空闲数字.当请求花哨的数字时,只需检查相应的索引位置是否空闲并返回该数字.这种方法的缺点是,当以常规方式分配数字时,如果中间有一个巨大的块(比如10亿个)由花式分配分配,那么next指针必须移动10亿次.

  2. 为了克服previos设计中提到的困难,我们可以使用某种链接的hashmap.我们维护一个双向链表(这取代了前一个设计中的数组)和另一个与列表长度相同的数组,其中数组的每个元素指向列表中的相应元素.因此,当在常规方法中分配数字时,我们在链表中推进指针并在分配时标记节点(与前一个方法相同).在分配花哨数字时,我们可以直接在列表中找到与首先索引到数组所需的特殊数字相对应的节点,然后是指针.一旦识别出节点,就会使前一个节点和下一个节点短路,这样我们就不必在进行常规分配时逐个跳过使用过的数字(这是前一种方法的问题).

让我知道我是否走在正确的轨道上.请告诉我任何我遗漏的重要细节.

system-design

8
推荐指数
2
解决办法
1万
查看次数

我怎样才能从多台机器上为我的 django 网站提供服务,那我怎样才能让它分布?

我有我的 django 网站,我想把它做成分布式,我知道系统设计和分布式系统的所有概念,但仍然不知道如何使用多个服务器为它提供服务。我正在尝试使我的系统分布式,以便我可以从两台机器上为我的网站提供服务(这就是分布式系统的工作方式)。我已经在 Django 中编写了我的网站。我想知道让我的同一个网站在两台机器上提供服务的步骤。这就是两个系统将如何相互了解,它们将如何连接以及每当请求进来时,将选择其中一个服务器来处理请求。我应该使用什么软件或工具来加入我的服务器,在这种情况下哪个软件将接受请求,以便它可以决定将请求发送到哪台机器以及在这种情况下应该如何配置数据库?

PS:我唯一知道的是如何使用一台服务器为我的 django 网站提供服务(从 Linode、DigitalOcean 获取机器实例)。我想为我的网站实现系统设计分布式系统概念,以便我可以通过亲自实施它来学习系统设计的所有概念

django distributed-computing distributed-system system-design server

8
推荐指数
2
解决办法
2050
查看次数

程序员在开发自己的 oAuth 服务时应该考虑哪些技术细节?

程序员在开发自己的 oAuth 服务时应该考虑哪些技术细节?

一直试图找出指南,但发现大部分oAuth相关文章都从消费者的角度进行讨论(即如何消费他人的服务)。我想oAuth用我的授权服务和资源服务设计我自己的系统。我应该遵循哪些技术细节?

architecture service oauth system-design

8
推荐指数
1
解决办法
118
查看次数

如何克服EAV数据库报告的缺点?

SQL中的Entity-Attribute-Value数据库设计的主要缺点似乎都与能够高效,快速地查询和报告数据有关.我读到的关于该主题的大部分信息都警告不要因为这些问题而实施EAV以及几乎所有应用程序的查询/报告的共性.

我目前正在设计一个系统,其中一个实体的字段在设计/编译时是未知的,并由系统的最终用户定义.EAV似乎非常适合这个要求,但由于我所读到的问题,我对实施它犹豫不决,因为这个系统也有一些非常繁重的报告要求.我我已经找到了解决这个问题的方法,但是想向SO社区提出这个问题.

鉴于典型的规范化数据库(OLTP)仍然不总是运行报告的最佳选择,一个好的做法似乎是拥有一个"报告"数据库(OLAP),其中来自规范化数据库的数据被复制到,广泛索引,以及可能非规范化以便于查询.是否可以使用相同的想法来解决EAV设计的缺点?

我看到的主要缺点是将数据从EAV数据库传输到报告的复杂性增加,因为您可能最终必须在EAV数据库中定义新字段时更改报告数据库中的表.但这几乎是不可能的,并且似乎是EAV设计提高灵活性的可接受的权衡.如果我使用非SQL数据存储(即CouchDB或类似的)用于主数据存储,这种缺点也存在,因为所有标准报告工具都期望SQL后端进行查询.

如果您有一个单独的报告数据库用于查询,那么EAV系统的问题是否会消失?

编辑:感谢您的评论到目前为止.我正在研究的系统的一个重要事项是,我真的只是在谈论为其中一个实体使用EAV,而不是系统中的所有实体.

系统的全部要点是能够从多个不同的源提取数据,这些数据是提前未知的,并且会对数据进行处理以获得关于特定实体的一些"最知名"数据.因此,我正在处理的每个"领域"都是多值的,我还需要跟踪每个领域的历史记录.对于这种情况的标准化设计最终是每个字段1个表格,这使得查询它无论如何都很痛苦.

以下是我正在查看的表格模式和示例数据(显然与我正在处理的内容有所不同,但我认为它很好地说明了这一点):

EAV表

Person
-------------------
-  Id - Name      -
-------------------
- 123 - Joe Smith -
-------------------

Person_Value
-------------------------------------------------------------------
- PersonId - Source - Field       - Value         - EffectiveDate -
-------------------------------------------------------------------
-      123 -    CIA - HomeAddress - 123 Cherry Ln -    2010-03-26 -
-      123 -    DMV - HomeAddress - 561 Stoney Rd -    2010-02-15 -
-      123 -    FBI - HomeAddress - 676 Lancas Dr -    2010-03-01 -
------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

architecture database-design system-design entity-attribute-value

7
推荐指数
2
解决办法
2421
查看次数

设计模式以促进这些行为(审计跟踪行为和撤消)

我正在研究一个需要展示这些行为的系统:

  1. 审计跟踪
  2. 撤消/恢复到特定版本(此类操作本身将被审核记录)

在这里看到了一个稍微类似的问题,但它只涉及我正在尝试做的部分内容.此外,我想捕获对象的整个生命周期(即CRUD).

我打算实现这个的方式如下:

  1. 拥有一个基于观察者模式的ChangeManager类
  2. 从基础对象派生我的对象,该对象"包装"命令模式中的更改
  3. 在任何CRUD事件上使用命令对象通知ChangeManager

注意:'change'命令将包括:

  • 一个(有序的)2元组的集合,详细说明了现场变化(上一个,新的)
  • 进行更改的用户的ID
  • 变化的时间戳

这只是"脱离我的头脑" - 我正在考虑采取的方法可能存在漏洞 - 我会感谢以前实施过此类行为的人的一些帮助,以及一般建议,专业人士和关于我上面概述的方法的缺点 - 或者可能是更好/替代的方法.一个或两个指向正确方向的片段也将非常感激!

我将使用C#作为实现语言.

c# design-patterns system-design

7
推荐指数
1
解决办法
2886
查看次数

如何设计分布式作业调度程序?

我想设计一个作业调度程序集群,它包含几个要执行cron作业调度的主机.例如,需要的作业run every 5 minutes被提交到集群,集群应该指出下次运行要触发的主机,确保:

  1. 容灾:如果不是所有主机都关闭,则应该成功触发作业.
  2. 有效性:只有一个主机可以解雇下一个工作.

由于容灾,作业无法绑定到特定主机.一种方法是所有主机轮询数据库表(当然有锁),这保证只有一个主机获得下一个作业运行.由于它经常锁表,有没有更好的设计?

cron distributed system-design cron-task

7
推荐指数
2
解决办法
1万
查看次数

有没有类似于 Redis pub/sub 的订阅 Redis Streams 的方法?

我正在构建一个数据管道,使用Maxwell Daemon实时读取 MySQL binlog ,Maxwell Daemon 将数据推送到 Redis 流。我构建了一个客户端,它使用 Redis 流中的数据并对其进行处理。目前,我正在使用无限循环轮询XREAD,睡眠时间为几毫秒,以消耗流中的数据,但我发现这是一个低效的解决方案。

I was searching for a way where I can somehow subscribe to the Redis stream and get notified whenever new entries are added to the stream and came across this GitHub issue where they talk about using the Redis pub/sub along with streams to achieve this functionality.

Is there a more efficient way of architecting this system?

architecture daemon system-design redis redis-streams

7
推荐指数
1
解决办法
4156
查看次数