小编Joe*_*Joe的帖子

Brokered与非代理消息系统的优缺点

我正在尝试设计一个模块化的实时监控系统,因此可以为不同的硬件和网络进行分布,扩展/重新配置.

我很快得出结论,我需要某种分布式企业消息系统.但是有很多选择,每个选项都有优点和缺点,其中一些选项决定了不同的架构.我正在努力弄清楚我是否需​​要经纪人或无代理系统,我是否需要某些系统的消息可靠性(例如RabbitMQ)或者像ZeroMQ这样的系统的轻量级高吞吐量,或者"按顺序到达"卡夫卡的高吞吐量.

首先,这些架构是否有意义?


ZeroMQ类型"Brokerless"系统:

在此输入图像描述

笔记:

每个"B部分"可以有许多"A部分",许多"B部分"进入"C部分"

好处:

  • 高吞吐量,低出租率
  • 轻松集成到组件中,轻量级部署(无需部署代理).

缺点

  • 邮件无法保证送达.有些可能会掉线.这可能是橙色突出显示区域中的问题.它对GUI来说并不重要,但如果本地控制模块正在做决定,它可能需要所有信息.(考虑到这一点,只是最新的可能就足够了 - 没有必要用过时的数据做出决定).同样,如果A和B之间的网络出现故障,则历史记录将具有不完整的历史记录.这有多重要啊?
  • 没有"发现".需要更多地管理组件之间的关系.

RabbitMQ类型Broker系统:

在此输入图像描述

好处:

  • 邮件保证交付.
  • 发现通过经纪人管理.

缺点

  • 慢得多,高延迟
  • 更多部署和维护(经纪人/ RabbitMQ需要在机器上安装,它不仅仅是内置于模块中)

中间选项:

我看过卡夫卡.这是经纪人,因此发现得到了解决.然而,它似乎比RabbitMQ更轻量级,虽然它不保证交付(因此更快/更低的延迟)它确实维持秩序,RabbitMQ没有.它还可以缓冲消息 - 因此,如果出现网络问题,可以检索它们.

写下来之后,我不确定保证交付的重要性.如果控制模块收到消息,如果它是"旧"则无关紧要.如果历史学家有完整的历史,那将是伟大的 - 但它是否必不可少?

在ZeroMQ中实现我自己的"消息缓冲区"可能是一种选择,用于在发生故障时存储消息的网络通信.我有比RabbitMQ更多的控制权,并且可以在我需要它时通过更不可靠(通过网络)进行消息传递时实现它.

显然,权衡这些优点或缺点是我的工作.我的问题是:还有什么需要考虑的吗?并且确实为这两个选项的结构是否合理?

我计划将大多数实现都放在C#中,而且我目前在消息传递系统方面没有经验.

architecture message-queue

11
推荐指数
1
解决办法
4173
查看次数

使用VS Code进行.NET Core调试 - "只能调试64位进程"

我没有VS 2017,我将在VS Code中构建一个Web前端,所以我想使用VS Code.

在.NET Standard 2.0发布之前,我们的库也在4.6.1中,所以我在我的.NET Core csproj中使用net461:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
  </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

该项目是最简单的dotnet new webapi入门应用程序.我可以用dotnet build和构建和运行dotnet run.我还有最新的ms-vscode.csharp扩展1.8.1.

但是,当我尝试使用VS Code附加或调试此应用程序时,我收到错误

无法附加到进程:只能调试64位进程

即使从控制台运行,然后附加非常简单的配置:

{
  "name": ".NET Core Attach",
  "type": "coreclr",
  "request": "attach",
  "processId": "${command:pickProcess}"
}
Run Code Online (Sandbox Code Playgroud)

选择该过程会因此错误而失败.我尝试使用以下命令构建针对x64的exe:

<PropertyGroup>
  <TargetFramework>net461</TargetFramework>
  <Platform>x64</Platform>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

但它会产生同样的错误.有人知道修复吗?这似乎是因为我的目标是net461,调试.Net Core不支持针对其他框架吗?

visual-studio-code asp.net-core

11
推荐指数
3
解决办法
5698
查看次数

Visual Studio错误:"调试器无法展开到此帧." 任何例外

我曾经能够在我的Visual Studio 2015 C#(WPF,如果相关)项目中发生异常时进行编辑和继续.我经常得到像null引用异常这样简单的东西,我可以快速解决问题并继续.

但是,最近我一直收到以下警告信息:

在此输入图像描述

"调试器不能放松到这个帧."

它指出,以下内容也不可能解散:

  1. 通过即时调试启动调试. - 事实并非如此,我正在通过从Visual Studio运行"开始调试"进行调试.
  2. 放松正在进行 - 不是我知道的,除非由于某种原因它总是在进行中!
  3. System.StackOverflowException或System.Threading.TreadAbortException - 这发生在所有异常上,包括Null引用之类的简单异常

我的谷歌搜索提出了一些文章说他们已经在2006年实现了这个功能,除此之外,只有大约3个结果回来了!

它似乎是项目特定的.在一个干净的新项目中:

Object o = null;
String s = o.ToString();
Run Code Online (Sandbox Code Playgroud)

引发异常,让我编辑并继续之前的行.在我现有的项目中,我无法放松,它会引发对话框.

编辑:使用不同的计算机和Visual Studio安装尝试它仍然有问题.

这似乎是Caliburn Micro的一个问题.

如果我的用户界面上有一个按钮,使用上面的代码链接到代码中的事件,我可以回放和调试.但是,如果我使用cal.message.attach并将代码放在引用的ViewModel的方法中,那么我无法放松.但我不确定.

c# debugging visual-studio caliburn.micro visual-studio-2015

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

防止 openapi-generator 在 JavaScript/TypeScript 中重命名枚举

我们使用 openapi 生成器来生成 REST 客户端。工作得非常好,直到我们开始在UPERCASE_UNDERSCORE格式中使用枚举。它去掉了下划线。这样做的主要问题是,由于属性名称与定义不匹配,因此在 Typescript 中转换此枚举变得非常痛苦。

这是一个 YAML 示例:

  properties:
    boostId:
      type: string
      maxLength: 50
    type:
      type: string
      enum:
        - BOOST_UNIQUE_ALERT_TYPE_COUNTER
        - BOOST_UNIQUE_SOURCE_SYSTEM_COUNTER
Run Code Online (Sandbox Code Playgroud)

生产:

var BoostConfiguration;
(function (BoostConfiguration) {
    /**
     * @export
     * @enum {string}
     */
    var TypeEnum;
    (function (TypeEnum) {
        TypeEnum["UNIQUEALERTTYPECOUNTER"] = "BOOST_UNIQUE_ALERT_TYPE_COUNTER";
        TypeEnum["UNIQUESOURCESYSTEMCOUNTER"] = "BOOST_UNIQUE_SOURCE_SYSTEM_COUNTER";
    })(TypeEnum = BoostConfiguration.TypeEnum || (BoostConfiguration.TypeEnum = {}));
})(BoostConfiguration = exports.BoostConfiguration || (exports.BoostConfiguration = {}));
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它删除了“BOOST”,并删除了下划线。我已经尝试过enumPropertyNaming=originalmodelPropertyNaming=original,似乎都没有改变任何东西(在枚举中)。这是我们的生成器脚本:

openapi-generator generate -i api/socosApi.yaml -g typescript-axios -o generated-sources/api --additional-properties=enumPropertyNaming=original,modelPropertyNaming=original
Run Code Online (Sandbox Code Playgroud)

typescript openapi-generator

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

"使用Angular2和ASP.NET调用节点模块失败,出现错误"

我的ASP.NET Core Angular 2网络应用程序出现间歇性异常:

Exception: Call to Node module failed with error: Error: This method is not implemented in Parse5DomAdapter: Parse5DomAdapter#getCookie
 at _notImplemented (D:\Projects\MyProject\MyProject\node_modules\angular2-platform-node\parse5-adapter.js:22:12)
 at Parse5DomAdapter.getCookie (D:\Projects\MyProject\MyProject\node_modules\angular2-platform-node\parse5-adapter.js:641:15)
 at CookieXSRFStrategy.configureRequest (D:\Projects\MyProject\MyProject\node_modules\@angular\http\bundles\http.umd.js:1597:92)
 at XHRBackend.createConnection (D:\Projects\MyProject\MyProject\node_modules\@angular\http\bundles\http.umd.js:1637:32)
 at httpRequest (D:\Projects\MyProject\MyProject\node_modules\@angular\http\bundles\http.umd.js:1975:24)
 at Http.get (D:\Projects\MyProject\MyProject\node_modules\@angular\http\bundles\http.umd.js:2086:20)
 at ApiService.getChatMessages (D:\Projects\MyProject\MyProject\ClientApp\dist\main-server.js:557:20)
 at ChatPageComponent.ngOnInit (D:\Projects\MyProject\MyProject\ClientApp\dist\main-server.js:513:23)
 at AppView._View_ChatPageComponent_Host0.detectChangesInternal (ChatPageComponent_Host.ngfactory.js:30:86)
 at AppView.detectChanges (D:\Projects\MyProject\MyProject\node_modules\@angular\core\bundles\core.umd.js:9566:18)

MoveNext
Run Code Online (Sandbox Code Playgroud)

我相信它与MVC视图有关,因为错误显示:

MoveNext in Index.cshtml

1.@{
2.    ViewData["Title"] = "Home Page";
3.}
4.
5.<app asp-prerender-module="ClientApp/dist/main-server">Loading...</app>
6.
7.<script src="~/dist/vendor.js" asp-append-version="true"></script>
8.@section scripts {
Run Code Online (Sandbox Code Playgroud)

这是我的index.cshtml中的代码.

它似乎发生在项目启动后的早期.这一切都可以正常工作,或者在执行任何导航时加载主页后会抛出错误.

我可以强迫它产生错误.我有4个导航目的地:

http://localhost:49954/home
http://localhost:49954/counter
http://localhost:49954/fetch-data
http://localhost:49954/chat-page …
Run Code Online (Sandbox Code Playgroud)

asp.net angular

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

有没有办法使用隐藏面板或扩展器的虚拟化?

我正在尝试使用我的WPF应用程序来提高性能,并且我遇到了复杂的ItemsControl问题.虽然我已经添加了虚拟化,但仍然存在性能问题,我想我已经解决了原因.

每个项目都包含一系列可扩展区域.因此,用户在开始时会看到摘要,但可以通过展开来查看更多信息.以下是它的外观:

在此输入图像描述

如您所见,有一些嵌套的ItemsControls.所以每个顶级项目都有一堆隐藏控件.虚拟化可防止加载屏幕外项目,但不会阻止项目本身内的隐藏项目.结果,相对简单的初始布局花费了大量时间.轻击其中一些视图,87%的时间用于解析和布局,加载需要几秒钟.

我宁愿用200ms来扩展用户决定的时间(如果!),而不是2s来加载整个页面.

真的要求建议.我想不出使用MVVM添加控件的好方法.WPF是否支持任何扩展器或基于可见性的虚拟化,或者我是否会创建自己的实现?

87%的数字来自诊断:

在此输入图像描述

c# wpf virtualization performance

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

构建状态管理存储(ngrx/redux).Flat作为数据的代表,还是作为代表的视图嵌套?

我正在使用ngrx存储来维护应用程序状态,normalizr用于压缩来自API调用和Immutable的数据.到目前为止,它一直运行得很好,但我正在进行一些更复杂的数据关系,我想知道如何继续构建商店.

为简化起见,我有两组对象.会话和发票.

一个用户登录并可以查看他的会话列表.商店中的状态保存在一个对象中ISessions:

export interface ISessions extends Map<String, any> {
  result: List<Number>;
  entities: {
    sessions: Map<Number, ISessions>,
    clients: Map<Number, IClient>,
    tutors: Map<Number, IProfile>
  },
  adding: boolean;
  loading: boolean;
  loadingFailed: boolean;
  error: string;
}
Run Code Online (Sandbox Code Playgroud)

(实体包含规范化输出 - 客户端和辅导员是会话中包含的嵌套类型)

这非常有效.reducer将其设置为加载,以便视图可以显示加载条,然后填充数据我可以在引用映射数据中的id的合理平坦的mannor中使用它.

他们可以加载发票,这在IInvoices对象周围非常相似:

export interface IInvoices extends Map<String, any> {
  result: List<Number>;
  entities: {
    invoices: Map<Number, IInvoice>,
    clients: Map<Number, IClient>,
    tutors: Map<Number, IProfile>
  },
  adding: boolean;
  loading: boolean;
}
Run Code Online (Sandbox Code Playgroud)

所以我的商店看起来像这样:

export interface IAppState {
  sessions: ISessions;
  invoices: IInvoices;
}
Run Code Online (Sandbox Code Playgroud)

但是,现在我来到了更为复杂的关系.会话分配给发票.有几种方法可以推进:

  1. 每个发票本身都有一个ISessions对象.这似乎违背了使数据结构平坦的想法.我也可能有重复的会话,存储在AppState.sessions和AppState.invoices中.然而,它更容易管理,因为IInvoice更直接映射到视图的状态(加载会话等存储在所有封装的发票ISessions对象中). …

state redux ngrx

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

对于列表中用户仍可以与之交互的“非活动”项目,我应该使用什么 aria 标签?

我在可视化中有一个数据列表,我希望使其尽可能易于访问。有两个彼此相邻的列表。

列表项有两种状态。多行可以是活动的或非活动的。可以选择单行。

在一个列表中选择某项,会将“相关”项目显示为活动和非活动。请参阅下面的简化示例。用户选择了“A 2”,它链接到“B 1”和“B 4”,所以 A2 是,aria-selected但没有aria-activeor aria-inactive,我想按照演示使用aria-disabled- 但这是否表明它不可交互?用户仍然可以单击禁用的项目来选择它。

对单个“选定”项目执行多个aria-selected, 和单个操作会更好吗?aria-current=true如果用户尚未做出选择并且所有内容都处于“活动”状态,则每个项目都会处于“活动”状态,这会很奇怪吗aria-selected=true

.container {
  display: grid;
  grid-template-columns: 200px 200px
}

.list div {
  margin: 0.5rem;
  background: grey;
}

.list .selected {
  background: red;
}

.list .inactive {
  opacity: 0.3;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="list">
    <div role="row">A 1</div>
    <div role="row" class="selected" aria-selected="true">A 2</div>
    <div role="row">A 3</div>
    <div role="row">A 4</div>
  </div>
  <div class="list">
    <div role="row">B 1</div>
    <div role="row" class="inactive" …
Run Code Online (Sandbox Code Playgroud)

html accessibility wai-aria

6
推荐指数
1
解决办法
656
查看次数

"该类型不包含任何可访问的构造函数" - 具有无参数构造函数

我正在尝试将类加载为静态资源:

<UserControl.Resources>
    <myControls:HelpTip x:Key="NavagationHT" Message="Test help tip message for navagation" />
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

我收到错误"类型HelpTip不包括任何可访问的构造函数".但是,该类是公共的,并且具有应该可访问的无参数构造函数:

public class HelpTip : PropertyChangedBase
{
    ...

    public HelpTip()
    {
        ID = Guid.NewGuid();
        HelpTipManager.AddHelpTip(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道可能导致此错误的任何其他内容?

编辑:现在已经解决了.我不确定如何或为什么,也许在其他地方有一些问题导致代码查找旧版本没有无参数构造函数?

c# wpf

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

使用带有运行时相关构造函数参数的 IoC/DI 容器

我正在将代码转换为使用带有 StructureMap 的 IoC 容器。试图让我的头脑理解这些事情,我觉得它开始“点击”​​,我可以看到它对后端有如此大的意义。

然而,我在努力的过程中发现了一些我不确定如何使其发挥作用的情况。具体来说,我的原始构造函数使用并非真正依赖项的参数执行了一些重要操作,或者执行了一些在运行时会发生更改的操作。

假设我从这个(IoC 容器之前)开始,我使用构造函数传递我的依赖项,但也向它发送一个ImportantObject运行时依赖项:

IMyPageViewModel myPageViewModel = new MyPageViewModel(importantObject, dialogManager, pageDisplay, viewModelProvider)
Run Code Online (Sandbox Code Playgroud)

在这里它正在构建:

public MyPageViewModel(ImportantObject importantObject, IDialogManager dialogManager,IPageDisplay pageDisplay, IViewModelProvider viewModelProvider)
{
    this.dialogManager = dialogManager;
    this.pageDisplay = pageDisplay;
    this.viewModelProvider = viewModelProvider;

    importantObject.DoThatImportantThing();
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在迁移到使用 IoC 容器,首先我认为我应该这样做:

//I need to create an instance to use, so I use my IoC container:
IMyPageViewModel myPageViewModel = container.GetInstance<IMyPageViewModel>();
Run Code Online (Sandbox Code Playgroud)

然后让它解决它的依赖关系,但是 importantObject 是在运行时设置的。我无法将其注册为依赖项:

public MyPageViewModel(IDialogManager dialogManager,IPageDisplay pageDisplay, IViewModelProvider viewModelProvider, IContainer container)
{
    this.dialogManager = dialogManager;
    this.pageDisplay = pageDisplay;
    this.viewModelProvider = …
Run Code Online (Sandbox Code Playgroud)

c# structuremap dependency-injection

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