小编Ale*_*one的帖子

性能监控:Ganglia与Graphite

我正在为我们的生产服务器寻找高性能监控解决方案,我遇到了许多免费工具和付费服务.我想避免付费服务,除非绝对必要,并且免费工具突出的两个是Ganglia和Graphite.

但是,我发现两者之间没有比较,我想知道是否有人对此有任何见解.

使用Ganglia vs. Graphite的优点和缺点是什么,反之亦然?

performance monitoring production-environment

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

CQRS组件在REST API中的角色和职责

关于带有DDD的CQRS以及构成每个组件的内容,有很多意见.我还没有开始研究事件采购,所以下面的列表中没有包含与此相关的任何内容.虽然对ES的深入了解会很有趣.

到目前为止,我有以下相关责任的组件(见下文).我在下面的几点中概述了一些问题.

REST端点/应用程序

  • 接收来自用户/ ui/etc的请求
  • 构建和发送相关命令
  • 如果命令需要来自其他有界上下文的值,则执行正确实例化命令所需的相关Finder调用(例如,Order需要用户ID)
  • 在GET的情况下:调用相关的Finder
  • Finders坐在应用程序的这个级别.有界上下文写入方(命令处理程序,聚合,工厂,域服务等)不应该调用Finders.这将保持封装并通过仅将所需数据(而不是完整的DTO)传递给命令,它将成为适度的反腐败层.
  • 例如:

AggregateId orderId = AggregateId.get(); AggregateId userId = finder.findUserAggregateIdByEmail(email); dispatcher.fire(new CreateOrderCommand(orderId,userId,orderItems));

命令

  • 通过调度命令对域进行更改
  • 命令是不可变的,包含有界上下文所需的数据,以改变它的状态或抛出异常
  • 可以在创建对象时验证命令输入,以避免发送无效命令
  • 例如: new CreateOrderCommand( orderId, userId, orderItems );

命令处理程序

  • 处理程序可以成功应用命令或引发异常
  • 每个命令只能有一个命令处理程序
  • 处理程序将加载或创建聚合根(存储库或聚合工厂)
  • 处理程序将该命令应用于聚合根
  • 处理程序处理存储库
  • 不应该触发命令(在其有界的上下文中)
  • 命令处理程序应该调度事件吗?例如,成功保存到数据库后?或者这仅仅是Aggregate的责任?

聚合工厂

  • 封装正确初始化聚合根所需的逻辑
  • 工厂可以访问存储库
  • 工厂应该访问域名服务吗?
  • 例如: factory.createOrder( orderId, userId, orderItems );

聚合根/聚合

  • 包含域逻辑,状态和行为
  • 负责调度事件
  • Aggregate Root封装了对Aggregates的访问
  • Aggregate Root应具有唯一标识它的ID
  • 不应与外部服务(事件发布者除外)交互
  • 例如: order.cancel();

域名服务

  • 这包含不太适合聚合根的内容
  • 域服务可以与哪些组件进行交互?
  • 域服务是否应该触发命令/事件?
  • 例如:不确定在这里使用什么,上面的第一点充其量是模糊的.大多数行为都很好地存在于Aggregate中,或者可以通过Sagas/Events/Commands实现.这里有什么有效的例子?

知识库

  • 负责加载/保存/更新/等我们的聚合
  • 例如: repo.load(orderId);

事件

  • 表示在聚合(或命令处理程序等,如果它们也可以触发事件)中发生的事情
  • 事件是不可改变的
  • 系统中的其他有界上下文可以使用事件来做出决策
  • 例如: new OrderCancelledEvent( orderId );

事件处理程序

  • 对发生的事件做出反应
  • 在相同或不同的有界上下文中,单个事件可以有多个事件处理程序 …

design-patterns domain-driven-design cqrs

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

为 REST API 构建 Java SDK 的最佳实践

我即将针对 REST API 开发 Java SDK,并想知道构建它的最佳实践方法是什么。我查看了 Google,还使用了许多连接到 REST API 的 SDK,但从来没有太多一致性。我遇到了一些我觉得有趣的模式,想知道哪一种可以被视为最佳实践(如果有的话),或者是否有替代方案?

我提供了示例/伪代码以方便起见。

1)模型/请求/客户端都是分开的。调用示例:

Client client = new Client( ... credentials ... );

try {
    Something obj = client.post( new PostSomethingRequest( ..params... ) );
} catch( Exception oops ) { ...handle... }

try {
    Something obj2 = client.get( new GetSomethingRequest( id ) );
} catch( Exception oops ) { ...handle... }
Run Code Online (Sandbox Code Playgroud)

2)模型和请求是捆绑在一起的,而客户端是分开的。调用示例:

Client client = new Client( ... credentials ... );

try {
    Something obj = client.post( new Something( ..params... ) …
Run Code Online (Sandbox Code Playgroud)

java rest sdk

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