我在Google Play上的应用中添加了"宣传视频".它放在youtube上,介于30秒到2分钟之间,可以在Android设备上访问的Google Play上正常播放.但是当我去play.google.com上的app网页(在我的笔记本电脑上,使用任何浏览器)时,我看不到它.请注意,屏幕截图显示正确,并且视频已在48小时前添加到应用程序中.
我已经搜索过很多帮助文章和谷歌,但没有找到任何类似的问题或解决方案.
我已经在我的 asp.net 核心应用程序中实现了健康检查。一项健康检查进行 2 项检查 - DbContext 连接和自定义一项检查 NpgsqlConnection。
在超过 99% 的情况下一切正常。有时,healthcheck 会失败并抛出TaskCanceledException 或OperationCanceledException。从我的日志中我可以看到这个异常是在大约 2ms-25ms 之后抛出的(所以不可能发生任何超时)。
重要提示:
当我多次点击healtchecks(浏览器中的简单F5)时,它会抛出异常。看起来您无法在之前的健康检查完成之前点击 /health 端点。如果是这种情况 - 为什么?即使我进行Thread.Sleep(5000);了自定义健康检查(根本没有数据库连接检查),如果我/health在 5 秒过去之前击中端点,它也会失败。
问题:healtheck 是否以某种方式“神奇地”单线程(当您再次点击该端点时,它会取消之前的健康检查调用)?
Startup.cs 配置服务
services
.AddHealthChecks()
.AddCheck<StorageHealthCheck>("ReadOnly Persistance")
.AddDbContextCheck<MyDbContext>("EFCore persistance");
Run Code Online (Sandbox Code Playgroud)
Startup.cs 配置
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.UseMiddleware<RequestLogMiddleware>();
app.UseMiddleware<ErrorLoggingMiddleware>();
if (!env.IsProduction())
{
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1");
c.SwaggerEndpoint($"/swagger/v2/swagger.json", $"V2");
});
}
app.UseHealthChecks("/health", new HealthCheckOptions()
{
ResponseWriter = WriteResponse
});
app.UseMvc(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试查找我的应用程序 CPU 使用率高的原因。
我相对简单的 .Net6 API 应用程序消耗 100% 的 1vCPU,每秒仅执行约 20 个请求(每个约 100 毫秒)(仅 2 个并发请求)。dotnet-trace显示不确定的瓶颈。
.Net6、ASP API 应用程序。应用程序在 kubernetes 集群上的 docker 容器中运行。它采用.Net6,并且具有专用的 1000m CPU(意味着 1 个完整的 vCPU)。
为了满足请求,应用程序调用数据库两次或三次,并调用外部 API 几次。该应用程序没有任何繁重的计算(没有图像处理,没有巨大的列表等)。刚刚等待DB调用和API调用,一些JSON序列化,HttpClient调用等。
问题是,1 个具有专用 1000m CPU(1 个 vCPU)的 pod 每秒处理大约 200 个请求,每个请求大约 100 毫秒,这意味着它只能同时处理大约 2 个请求。这样的负载几乎消耗了 100% 的专用 CPU,并且会创建新的 Pod。
IMO,由于大部分工作是“等待数据库或 API 返回数据”,我的服务器(每个 Pod)应该处理大约 10 倍的负载。
我dotnet-trace在我的容器中运行,但我无法真正理解数据。我的代码消耗的 CPU 总量不到 5%。以下功能消耗了大部分:
ad 1. ~21% CPU System.Reflection.Emit.DynamicMethod.CreateDelegate- 这可能意味着什么?使用以下提示是否意味着 NewtonsoftJson 每次序列化某些内容时都会编译代码?
ad 2. ~13% …
我知道聚合应该很小并且它们应该保护不变量。我也知道在聚合中保存大型集合会影响性能。
我有一个用例,需要保护它的不变量,但也会导致大量收集。
Aggregate 是Vendor,它可以有多个活动的Promotion (s)。每个Promotion都有PromotionType、StartDate和EndDate。不变量是:
public Vendor : Aggregate {
public Guid Id;
public List<Promotion> Promotions;
// some other Vendor props here
public void AddPromotion(Promotion promo) {
// protect invariants (business rules) here:
// rule_1: if 2 promotions are already active during any time between promo.Start and promo.End then throw ex
// rule_2: if during any time between promo.Start and promo.End there …Run Code Online (Sandbox Code Playgroud) 我想在颤动中使用自定义拖动手柄来重新排序列表(可以立即工作,无需先长按)。
为了实现这一目标,我做了:
buildDefaultDragHandles: false,
Run Code Online (Sandbox Code Playgroud)
我用过ReorderableDragStartListener。
代码:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final …Run Code Online (Sandbox Code Playgroud) 我最近开始实施一些负载测试。我正在使用 .NetCore、EF Core 2.2 和 Postgres。
我正在调用我的测试服务器(使用HttpClient client.PostAsync("/api/resource");)。
我发现我的请求很少因为连接太多而失败 ( The connection pool has been exhausted, either raise MaxPoolSize (currently 100) or Timeout (currently 15 seconds))。所以我实施了这样的方法:
services.AddDbContext<MyDbContext>(optionsAction: optionsBuilder =>
optionsBuilder.UseNpgsql(Config.ConnectionString,
optionsAction =>
{
optionsAction.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
}));
Run Code Online (Sandbox Code Playgroud)
它有点帮助,但仍然,当调用例如 500 个请求时,我遇到了错误。
我想,它应该以某种方式工作,例如,如果系统能够同时处理 100 个请求(例如 100 个到数据库的连接),则其余请求(使用MyDbContext)应该等待(而不是失败)。
所以我的问题是:
EnableRetryOnFailure?最近我发现以下方法对我参与的许多项目都很有效。然而,问题是,我读到 ef core DbContext 本身就是一个 UoW,我不应该创建自己的 UoW 和存储库。但在这种情况下,我无法从应用程序逻辑层中抽象出持久层。
TL;DR 问题是: 是否有可能既不拥有自己的存储库也不拥有 UoW,并且仍然遵循上述架构,并将 DbContext 作为 UoW?
我的架构如下:
第 1 层(最内部):聚合、实体、POCO 域类、值对象
第 2 层: 域服务
第 3 层: 应用程序服务(CQRS 命令、查询、处理程序)和存储库接口
第 4A 层:(持久层)存储库实现(此处注入 DbContext)EF Core 映射(ORM 映射)
第 4B 层: Asp MVC API(此处注册 DI)
API 的控制器只是发出命令和查询(通过 MediatR)。
上述方法的优点是应用程序核心(第 1、2 和 3 层)完全从持久性中抽象出来。缺点是您确实必须编写自己的存储库。
这是正确的方法吗?或者我错过了什么?
domain-driven-design entity-framework cqrs onion-architecture
android ×2
c# ×2
aggregate ×1
asp.net ×1
asp.net-core ×1
cpu-usage ×1
cqrs ×1
ef-core-2.2 ×1
flutter ×1
google-play ×1
health-check ×1
invariants ×1
kubernetes ×1
postgresql ×1