Questions tagged «architecture»

软件系统的高级设计和描述。架构设计提取了实现,算法和数据表示的细节,以专注于“黑匣子”组件的交互。

18
您首先看什么:代码还是设计?
如果您刚刚被介绍到一个新项目中,那么想要了解其工作原理的第一件事是什么? 您首先寻找设计吗?如果有设计,您会在其中寻找什么?类图或部署图或序列图还是其他? 还是直接输入代码?如果是这样,您如何理解不同层之间的相互作用?

2
对Web应用程序使用单独的API和UI服务器的好处
在工作中,我们已经开发了将近两年的大型内部应用程序;我最近才刚加入该项目,有些架构使我有些困惑,所以我希望这里的人可以在我问建筑师这些同样的问题之前提供一些建议(这样我可以与他们进行有见地的讨论)。 如果下面的内容过长,我深表歉意,我只想在问我的问题之前,先对系统的外观有一个很好的了解:) 设置系统的方式是,我们有一个主要的Web应用程序(asp.net,AngularJS),该应用程序主要只是聚合来自其他各种服务的数据。因此,基本上,它是AngularJS应用程序的宿主。实际上,有一个MVC控制器引导客户端,然后每个其他控制器都是WebAPI控制器。 这些控制器处理来自客户端的调用,这些控制器始终部署到仅托管Web应用程序的主机上。我们目前有4个这样的盒子。 但是,这些调用最终会路由到另一组WebAPI应用程序(通常是每个业务领域,例如安全性,客户数据,产品数据等)。所有这些WebAPI也会一起部署到专用盒中。我们也有四个这样的盒子。 除了一个例外,我们组织的任何其他部门均未使用这些WebAPI。 最后,这些WebAPI对“后端”服务进行了另一组调用,这些服务通常是遗留在各种ERP系统和数据存储(我们无法控制)之上的传统asmx或wcf服务。 我们应用程序的大多数业务逻辑都在这些WebApi中,例如转换旧数据,对其进行汇总,执行业务规则以及通常的事情类型。 我感到困惑的是,在WebApplication和为其提供服务的WebAPI之间进行这样的分离可能带来什么好处。由于没有其他人在使用它们,因此我看不到任何可伸缩性的好处(即,再放入4个API盒来处理增加的负载是没有意义的,因为API服务器上的负载增加必然意味着Web服务器上的负载增加-因此,Web服务器与Api服务器的比例必须为1:1) 我也看不到必须进行额外的HTTP调用的任何好处浏览器=> HTTP => WebApp => HTTP => WebAPI => HTTP =>后端服务。(我的问题是WebApp和WebAPI之间的HTTP调用) 因此,我目前正在寻求将当前的WebAPI从单独的解决方案迁移到WebApplication解决方案中的单独项目,并在它们之间使用简单的项目引用,并使用一个部署模型。因此,它们最终将成为类库。 在部署方面,这意味着我们将有8个“全栈” Web框,而不是4 + 4。 我看到的新方法的好处是 性能提高,因为Web应用程序和WebAPI服务器之间的序列化/反序列化周期减少了 在Web应用程序和WebApi服务器的传出和传入边界上,根据DTO和映射器可以删除(即无需维护/测试)的大量代码。 具有更好的能力来创建有意义的自动集成测试,因为我可以简单地模拟后端服务并避免中间层HTTP跳转带来的混乱。 所以问题是:我错了吗?我是否错过了将WebApplication和WebAPI框分开的一些基本“魔术”? 我研究了一些N-Tier架构材料,但似乎找不到任何可以为我们的情况带来具体好处的东西(因为据我所知,可伸缩性不是问题,这是一个内部应用程序,因此WebAPI应用程序的安全性不是问题。) 而且,如果我将系统重组为建议的设置,那么在收益方面我将损失什么?

4
用于事件日志指标的数据体系结构?
我的服务具有大量正在进行的用户事件,因此我们想做一些事情,例如“ 从日期D开始计数事件类型T的发生”。 我们正在尝试做出两个基本决定: 存储什么?存储每个事件与仅存储聚合 (事件日志样式)记录每个事件并在以后对它们进行计数。 (时间序列样式)每天存储一个汇总的“ 日期D的事件E数” 数据存储在哪里 在关系数据库(尤其是MySQL)中 在非关系(NoSQL)数据库中 在平面日志文件中(通过,通过网络集中收集syslog-ng) 什么是标准做法?在哪里可以找到有关比较不同类型系统的更多信息? 额外细节: 事件流总数很大,每天可能有数十万个条目 但是我们目前的需求只是计算其中的某些类型的事件 我们不一定需要实时访问原始数据或聚合结果 恕我直言,“将所有事件记录到文件中,稍后对其进行爬网以过滤和聚合流”是一种非常标准的UNIX方式,但是我的Rails-y同胞似乎认为除非在MySQL中,否则什么都不是真实的。

2
命令在CQ [R] S模型中应该有多精细?
我正在考虑一个项目,我们基于WCF的SOA的迁移部分转移到服务总线模型(可能nServiceBus),并使用一些基本的发布-订阅实现命令查询分离。 我对SOA甚至服务总线模型都不陌生,但我承认直到最近,我的“分离”概念还仅限于常规数据库镜像和复制。尽管如此,我还是被这个想法所吸引,因为它似乎提供了最终一致的系统的所有好处,同时又避免了许多明显的缺点(最明显的是缺乏适当的交易支持)。 我从Udi Dahan那里读了很多关于该主题的书,他基本上是 ESB体系结构的专家(至少在Microsoft世界中是这样),但是他说的一件事确实让我感到困惑: 当我们获得更大的实体并在其上具有更多字段时,我们也将有更多的参与者与这些相同的实体一起工作,并且在任何给定时间某些事物触及它们的某些属性的可能性更高,从而增加了并发冲突的数量。 [...] CQRS的核心要素是重新考虑用户界面的设计,以使我们能够掌握用户的意图,因此,使客户成为首选对象对于用户而言是与指示客户已搬家或已获得客户不同的工作单元。已婚。如上所述,使用类似Excel的UI进行数据更改不会捕获意图。 -Udi Dahan,澄清了CQRS 从引文中描述的角度来看,很难与这种逻辑争论。但这似乎与SOA背道而驰。SOA(实际上是一般的服务)应该处理粗粒度的消息,以便最大程度地减少网络震颤,这还有许多其他好处。 我认识到,当您拥有分布良好,消息队列良好且没有RPC负担的系统时,网络颤抖就不再是问题,但是完全消除该问题似乎并不明智。Udi几乎似乎在说,每个属性更改(即字段更新)都应该是它自己的命令,很难想象一个用户可能像传统上那样经常更新数百或数千个组合的实体和属性。网络服务。 给定良好的高度参数化查询,表值参数或对临时表的批量插入,SQL Server中的一次批处理更新可能花费一秒钟的时间;一次处理所有这些更新很慢,很慢,而且OLTP数据库硬件是所有扩展/扩展中最昂贵的。 有什么办法可以调和这些相互竞争的问题?我是否以错误的方式思考?这个问题在CQS / ESB领域是否有众所周知的解决方案? 如果不是,那么如何确定命令中粒度的“正确级别”呢?是否有一些“标准”可以用作起点(类似于数据库中的3NF),并且仅在仔细分析表明潜在的显着性能优势时才偏离标准? 或者,尽管各种专家表达了一些强烈的意见,这可能只是其中的一种吗?

4
我应该在哪里进行本地化(服务器端还是客户端)?
我目前正在基于富JavaScript客户端开发一个新的Web应用程序,该客户端可与服务器上的多个REST Web服务进行通信。该应用程序打算在至少两个使用不同语言的国家/地区使用,因此我们需要对其进行本地化。 我的问题是我应该在哪里管理本地化:REST服务应该接收请求并发送带有本地化数据的答案,还是客户端应该接收并发送通用数据然后负责进行本地化?


2
DDD有界的上下文和域?
我一直在一个相对复杂的应用程序中,该应用程序具有10多个数据库表(聚合,实体/值对象)并应用DDD。此时,它似乎基本上是DDD-Lite,这意味着有应用程序/域服务,域模型(实体,值对象)和存储库。 我拿起一本书《实现DDD》,他首先提到的是DDD-Lite和Bounded Contexts和Domain Events缺失,这是开始DDD时常见的第一个错误。 目前,我已经尝试通过聚合关系来组织域模型,并使用名称空间进行演示。 我没有看到与将域模型项目划分到单独的有界上下文中有关的好处/缺点(尚未)。也许稍后会变得很明显,但我希望获得有关绑定上下文(以及可能绑定到子域等的一些现实生活)的反馈。

11
为什么.NET中的所有类都全局继承自Object类?
这对我来说非常有趣,哪些优点为框架提供了“全局根类”方法。简单地说,是什么原因导致.NET框架被设计为具有一个根对象类,并且具有适用于所有类的通用功能。 如今,我们正在设计一个供内部使用的新框架(SAP平台下的框架),我们都分为两个阵营-第一个阵营认为框架应该具有全球根源,第二个阵营认为相反。 我在“全球根源”营地。我的理由是,这种方法将产生良好的灵活性并降低开发成本,导致我们不再开发通用功能。 因此,我非常想知道是什么原因真正促使.NET架构师以这种方式设计框架。

10
如何减少技术债务而获得报酬?
我目前在一家技术含量很少的小型公司工作。我是其中之一的唯一开发者。大约一年前,我获得了该产品的旧版本并开始“支持”它。 客户只谈论新功能,业务价值和其他类似的功能。问题是,尽管代码是用C#编写的,但它是过程性的。没有抽象,仅在Visual Studio需要它们的地方才使用类-例如表单。这些类的实现确实很糟糕,并且代码很难维护。 这些年来,我花费自己的时间进行重构。在最新版本中,有一些漂亮的抽象等。我不得不从头开始重新实现许多组件,我真的觉得向这些组件添加新功能或更改行为要比其他组件容易得多。 问题是,我花自己的时间。我非常喜欢结果,但我不喜欢每天工作12个小时。您去过类似情况吗?我应该怎么做?我已经尝试过讨论它,但仍然没有成功。 当我们决定实现需要对遗留代码进行大量更改的新功能时,我只是感到害怕。这可能会让客户感到震惊:为什么您需要8个小时来更改这些图标?客户只是不在乎我需要更改代码中的500个位置。我还应该首先找到所有这500个地方。 有任何想法吗?

9
如何判断软件是否高度耦合?
我对术语“高度耦合”很熟悉,但是很好奇是否存在迹象(代码气味)可以表明代码高度耦合。我目前正在使用Java EE,但这可以应用于任何语言。 编辑: 如果有人感兴趣,这篇文章听起来很有帮助:追求代码质量:当心这对夫妇!(IBM)

4
使用数据库时保持面向对象和可测试性
使用数据库但保持单元可测试性的一些OOP策略是什么?假设我有一个User类,并且我的生产环境适用于MySQL。我看到了两种可能的方法,如下所示使用PHP: 通过在与接口$ DATA_SOURCE load()和save(),抽象数据的后端源。测试时,请传递其他数据存储。 $ user =新用户($ mysql_data_source); $ user-> load('bob'); $ user-> setNickname('Robby'); $ user-> save(); 使用访问数据库并将结果行传递给用户的构造函数的工厂。测试时,手动生成$ row参数,或在UserFactory :: $ data_source中模拟对象。(如何保存对记录的更改?) class UserFactory { static $data_source; public static function fetch( $username ) { $row = self::$data_source->get( [params] ); $user = new User( $row ); return $user; } } 我旁边有设计模式和简洁代码,但我一直在努力寻找适用的概念。

2
是什么使大型复杂软件产品变慢?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 由于很大程度上无关紧要的原因,我在这么长时间内再次安装了Delphi 7。我不得不说,我完全被震撼了-在某种程度上我还没来过。这根本不是我记得的东西。安装耗时约30秒。启动它花了2秒钟,并且立即可用。我可以在启动后第二秒钟按“运行”,不到一秒钟后,空白程序就已经可见并正在运行。万岁为计算机变得如此快! 但是我之所以被这样震撼,是因为通常我使用Visual Studio 2010,一点也不觉得这样快。诚然,Delphi 7是一个比Visual Studio 2010小得多的系统,但是它确实具有所有真正必要的东西的外观:控件面板,表单设计器,具有代码完成功能的代码编辑器。我意识到该语言可能更简单,代码完成功能可能不太强大,IDE可能没有那么可扩展且功能丰富,但是仍然:我不了解如何(即通过哪种机制)进行许多额外的功能(我可能还没有触发过)使类似Visual Studio的系统总是比较呆滞。 我想问一下在Visual Studio规模方面具有丰富经验的人:是什么让它们变慢了?是将代码库保持在人类理解能力范围内所需的抽象层吗?是否需要运行大量的代码?在时钟周期/内存使用部门(付出惊人的巨大代价)上,是否倾向于节省程序员时间的方法的现代趋势?

22
您应该在什么时候开始考虑性能?
在构建应用程序时,我发现自己不断在问这是否是执行或实现某些功能的最佳方法。通常,我会在stackoverflow或其他论坛上发布问题,仅希望收到反馈,以便收到有关如何不“把马放到马前”有关性能的评论。大多数程序员在应用程序完成之前是否真的没有考虑性能,还是性能绝对不能接受?我的意思是,我了解开发环境与生产环境不同,您不应该完全依赖开发笔记本电脑的结果...但是,有些实践和技术可以提供比其他产品更好的性能。 在整个开发过程中考虑性能是不好的做法吗?在性能真正下降之前,我应该推迟考虑这些因素吗? 更新资料 明确地说,我是在谈论您正在考虑或即将使用某些功能的情况。您知道有几种实现方法,但是您不确定每个实现的扩展程度。另外,可能还有几种您不熟悉的技术。在较小的规模上,任何一种方法都可能是适当的,但是在较大的规模上,某些方法会跟上,有些则不会。通常,当我征求意见或指导时,答复是:以后再担心...

3
什么是多租户应用程序?
根据在线可用定义,“ 多租户是一种架构,其中软件应用程序的单个实例为多个客户提供服务 ”。这意味着我拥有一家餐馆或学校的网站,并且我提供了访问其他餐馆或学校的权限,以便他们使用我在购买学校管理产品后提供的凭据将其应用程序与自己的数据一起使用。就像我的网站像schoolmanagement.com一样,我为不同的学校客户(例如school1.schoolmanagement.com和school2.schoolmanagement.com)提供了不同的子域,但是这两个子域后面的代码相同。两家学校都有不同的功能或主题,这取决于它们各自的数据库。所以我需要提供schoolmanagement.com进行登录,一旦我的客户基于他们的登录凭据登录,我就会重定向到他们各自的URL,例如school1.schoolmanagement.com。 这是我对多租户应用程序的理解。我的理解正确吗?我可以通过任何在线多租户应用程序吗?

6
自治微服务,事件队列和服务发现
最近,我一直在阅读有关微服务的很多文章,这是到目前为止我得出的一些结论(如果我在任何时候错了,请更正我)。 微服务架构与域驱动设计配合得很好。通常一个MS代表一个有界上下文。 如果微服务A需要驻留在微服务B中的功能,则我的模型可能是错误的,并且A和B 实际上应该是一个微服务/ BC。 微服务之间的同步通信(直接HTTP请求)很糟糕,导致它违背了微服务的目的,并引入了组件之间的耦合。 服务之间的异步通信是可取的。服务应将事件发布到消息队列,以便其他服务可以订阅和处理事件的一部分,或使用它复制上下文所需的部分数据。这样,服务可以处理请求,甚至其他服务也已关闭,而在同步通信中则不会。 如果微服务A发布事件,微服务B订阅该事件并产生一个新事件作为结果,则微服务A不应是一个正在处理的新创建事件,因为这将是循环依赖性。在这种情况下,我们应该引入第三种微服务,或者将A和B合并到AB微服务中。 微服务实际上是一个误导性术语。我们应该为小环境而努力,但这不是必须的。术语不应该是“微服务”,而是“ 足够大以进行工作服务 ”。 微服务使我们可以更轻松地引入新功能,而不必担心会破坏整个系统。可以通过引入新服务或重构现有服务之一来完成。 每个微服务都应具有自己的数据存储。数据复制/复制是此体系结构中的理想行为。 除了证实我对这种体系结构的理解之外,问题的其他部分主要与服务发现有关。如果服务异步通信,并使用亚马逊SQS之类的中央事件队列,这是否意味着服务发现在这样的体系结构中没有位置? 服务不应对系统中的其他服务有任何了解。他们只知道应该发布或订阅的上下文和事件吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.