.NET 中 .Result 避坑指南:不同框架下的死锁与线程池饥饿
这篇只讲一个知识点:在 .NET 代码里用 .Result(或 GetAwaiter().GetResult())同步阻塞异步任务,为什么在不同框架下会触发不同类型的事故。 问题背景 同样一行代码,在两个系统里出现了完全不同的故障: 老系统(ASP.NET MVC 5)请求直接卡死,不返回 新系统(ASP.NET Core)不是直接死锁,而是高峰期吞吐突然掉到很低,请求排队超时 两边都有这段写法: …
这篇只讲一个知识点:在 .NET 代码里用 .Result(或 GetAwaiter().GetResult())同步阻塞异步任务,为什么在不同框架下会触发不同类型的事故。 问题背景 同样一行代码,在两个系统里出现了完全不同的故障: 老系统(ASP.NET MVC 5)请求直接卡死,不返回 新系统(ASP.NET Core)不是直接死锁,而是高峰期吞吐突然掉到很低,请求排队超时 两边都有这段写法: …
订单服务最容易出现的稳定性问题,不是业务代码写错,而是下游支付、库存、短信网关一抖,整个接口成功率跟着雪崩。看起来只是一次超时,实际上会引发重试风暴、线程池占满、数据库回写积压。今天这篇就只做一件事:把外部依赖调用链路收敛到可控、可观测、可恢复的状态。 1. 问题背景:服务没挂,为什么成功率先掉 线上经常出现这种现象: API 进程还活着,CPU 占用也不高,可能只有40%(举个例子,非真实数 …
这篇文章不讨论完整身份平台建设,只聚焦 ASP.NET Core 里最常见、也最容易出错的一段:JWT 认证、Policy 授权,以及资源级权限边界该怎么落到代码里。 问题背景 真实现场:一个后台退款接口原本只允许财务角色调用,但线上排查发现,普通运营账号只要拿到有效 token,也能调用成功。 根因并不复杂: 接口加了 [Authorize] 系统只校验“是否登录” 没有继续校验角色、权限和资源 …
“事务加上了,这可不就问了嘛”。真正到线上一跑,问题就冒出来了: 数据库提交成功了,但消息没发出去 外部调用成功了,但本地事务回滚了 SQL 重试机制打开后,一段代码被重复执行了两次 同一个请求里明明都写在一起,最终状态还是不一致 这篇文章不讲抽象理论,直接回答一个工程问题:在 EF Core 里,事务边界到底该怎么画,哪些事情能靠数据库事务兜住,哪些事情必须换一种设计。 问题背景:为什么“写成功 …