自定义C#模块与Edge上的Azure功能

时间:2018-03-27 13:38:56

标签: azure .net-core azure-functions azure-iot-edge

目前在Azure IoT Edge上创建基于代码的自定义模块有两个主要选项:

  • 自定义模块(目前是.NET Core,很快也是Python等)
  • Azure功能(目前仅限.NET Core)

所以现在我的问题是,当我想在.NET Core(C#)中编写自定义代码时,使用一个优于另一个会有什么好处?

函数需要的样板代码少得多,但性能如何?

2 个答案:

答案 0 :(得分:4)

我不知道。让我们的板凳吧! ...在Windows上导致我有用的东西。 CPU是Core i7-3770K。

.NET Core Web API(v2.1.3,中间件是dotnet new webapi连接的任何内容) -

public class ValuesController : Controller
{
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

Azure Functions脚本宿主(v2.0.11587.0) -

// run.csx
public static IEnumerable<string> Run(HttpRequest req)
{
    return new string[] { "value1", "value2" };
}


// host.json
// Default "consoleLevel" is verbose which blocks on flushing stdout,
// performance suffered unnecessarily so i switched to "error".
{
    "tracing": {
      "consoleLevel": "error",
      "fileLoggingMode": "debugOnly"
    }
}

dotnet core and functions host side by side

结果:

// .NET Core Web API
C:\lab\bomb>bombardier-windows-amd64.exe -n 654321 http://127.0.0.1:5000/api/values

Bombarding http://127.0.0.1:5000/api/values with 654321 requests using 125 connections
 654321 / 654321 [===================================] 100.00% 23s
Done!
Statistics        Avg      Stdev        Max
  Reqs/sec     27744.21    6713.91  124074.44
  Latency        4.45ms   200.44us    46.97ms
  HTTP codes:
    1xx - 0, 2xx - 654321, 3xx - 0, 4xx - 0, 5xx - 0
    others - 0
  Throughput:     6.69MB/s



// Functions script host with .csx
C:\lab\bomb>bombardier-windows-amd64.exe -n 654321 http://127.0.0.1:7071/api/HttpTrigger

Bombarding http://127.0.0.1:7071/api/HttpTrigger with 654321 requests using 125 connections
 654321 / 654321 [===================================] 100.00% 5m31s
Done!
Statistics        Avg      Stdev        Max
  Reqs/sec      1976.64     181.69    4213.32
  Latency       63.23ms    20.74ms      2.12s
  HTTP codes:
    1xx - 0, 2xx - 654321, 3xx - 0, 4xx - 0, 5xx - 0
    others - 0
  Throughput:   492.23KB/s

为了科学,我在v2(.NET Core)和v1(.NET Full Framework)运行时也进行了预编译函数(.DLL)的测试运行。

TL; DR

.NET Core Web API (v2.1.3):                             27744 requests/sec
Functions script host (v2.0.11587.0) .csx:               1976 requests/sec
Functions script host (v2.0.11587.0) precompiled DLL:    2062 requests/sec
Functions script host (v1.0.11535.0) precompiled DLL:    4734 requests/sec

YMMV。如果您真正处理某些IO而不仅仅是从内存中返回16字节,那么事情可能会有所不同。但是它就是这样啊。如果你不需要额外的好东西,功能给你,去原始的dotnet。

答案 1 :(得分:1)

除了表演方面我还没有得到任何答案,这是我最后一次采取的行动:

  • 在以下情况下,功能非常合适:
    • 首先:代码不需要经常执行(例如,不要通过函数路由所有消息),因为性能可能是一个限制因素
    • 您需要为代码提供某种HTTP接口。只需使用HTTP触发功能,您就不必担心在自定义代码中打开和维护Web服务器
    • 您需要执行一些时间触发(计划)代码。构建一个时间触发的函数,你已经完成了
    • 你不喜欢任何样板代码;-)在你真正只需要编写和维护你自己的代码的意义上,函数很棒。但是,由于自定义模块的模板带来了所有必需的锅炉板代码,我不认为这是一个太大的优势。

对于任何其他自定义模块,我很可能会去构建自己的东西。如前所述,从模板开始,编写自己的模块非常简单。

希望能帮助别人! (这不是微软官方的回答;))

您可以在我的github仓库中找到不同触发边缘功能的一些示例:https://github.com/sebader/azureiotedge/tree/master/edge-functions