小编Nie*_*sma的帖子

将 Actor 模型与 RESTful API 相结合

我\xe2\x80\x99 已经研究 actor 模型有一段时间了,并试图找出如何将其与 RESTful API 正确结合。我\xe2\x80\x99m正在努力如何通过使用ask-pattern或actor-per-request来分离两层的职责。对于这两种模式,请求-回复语义都会泄漏到参与者模型中,这看起来像是一种反模式。大多数由 HTTP 请求发起、发送给参与者的消息都需要回复。接收参与者有多个条件,需要向 API 发出它无法满足请求的信号。

\n\n

此外,在输入验证方面什么被认为是良好实践;是否应该将其作为 HTTP 的一部分来实现(例如,如果字段 X 是有效的电子邮件地址,如果字段 Y 包含整数)。对于复杂的域逻辑,当(前置)条件失败时,参与者如何/应该通知发送者?

\n

actor-model actor akka.net

4
推荐指数
1
解决办法
1157
查看次数

使用IHttpAsyncHandler高效转发HTTP请求

我正在开发一个基于Martin Fowler(链接)模式的HTTP前端控制器.在我的情况下,控制器具有以下职责: - 解组封装的数据 - 授权请求 - 记录 - 将请求中继/转发到另一台服务器

以下是可能的解决方案: - (同步)IHttpHandler,使用WebClient或HttpWebRequest类转发请求 - (异步)IHttpListener(非IIS解决方案) - (异步)IHttpAsyncHandler

理想的情况是FC可以处理大量并发请求(> 10000 TPS)而不会烧毁CPU.

为了测试解决方案,我创建了一个小型框架,其中有3个客户端发出请求,一个位于中间的前端控制器和两个响应FC传递的请求的服务器.框架基准测试3场景,首先测试具有小有效载荷的快速响应,其次:具有大有效载荷(> 100KB)的快速响应以及最后具有慢响应(> 3秒)和小有效载荷的测试.

使用同步HTTP处理程序进行的最后一次测试,每秒事务数(TPS)降至最低值(<25 TPS).我的猜测是,这是由于处理程序在等待响应时阻塞线程.为了克服这个问题,我开始实现一个异步处理程序(参见下面的代码).问题是,它简单无效.

想到的最后一个(未经测试的)解决方案是使用HttpListener类.猜测这是一个更轻量级的解决方案,具有良好的粒度控制并发性.我已经看过使用JoséF.Romaniello(链接)的RX框架的示例实现.

我的问题是这样,为什么处理程序代码不起作用?,这是最有效的方法吗?或者我应该赞成HttpListener解决方案.

异步HTTP处理程序代码:

public class ForwardRequestHandler : IHttpAsyncHandler
{
    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
    {
        var uri = GetForwardUriFor(context.Request.Url.PathAndQuery);

        var proxy = HttpWebRequest.Create(uri) as HttpWebRequest;
        return proxy.BeginGetResponse(new AsyncCallback(EndProcessRequest), new ForwardedRequestContext(context, proxy));
    }

    public void EndProcessRequest(IAsyncResult result)
    {
        var proxy = result.AsyncState as ForwardedRequestContext;
        proxy.TransferResponse(result);
    }

    public bool IsReusable …
Run Code Online (Sandbox Code Playgroud)

.net c# front-controller ihttphandler

3
推荐指数
1
解决办法
2591
查看次数