为什么此同步代码代码_NOT_慢?
功能
我具有以下Azure函数的
public class Function {
final RefWrapper toReturn = new RefWrapper();
private static class RefWrapper {
String value = "";
}
@FunctionName("raceConditionTest")
public synchronized HttpResponseMessage raceConditionTest(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS
),
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context
) throws IOException {
toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
Thread.sleep(1000 * 10);
return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
}
}
,它显示了种族条件:当我并行10次调用此功能时,标头的值不同,所有十个请求都会返回相同的值,如预期 - 实现了种族条件。如果我同步,如下所示:
@FunctionName("raceConditionTest")
public synchronized HttpResponseMessage raceConditionTest( /*args*/ ) {
synchronized (toReturn) {
toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
Thread.sleep(1000 * 10);
return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
}
}
并发送并行请求,那么,如预期的那样,每个请求正确返回输入值,则可以防止比赛条件。
但是,出乎意料的是,所有请求同时返回,它们似乎并没有排队。我已经查看了我的指标,并且没有创建其他功能实例。
问题
为什么此代码不慢,为什么请求不必等待?我假设此行为与Azure函数运行时有关 - 是否保证,记录或合理地期望稳定?
The Function
I have the following Azure Function, which displays a race condition:
public class Function {
final RefWrapper toReturn = new RefWrapper();
private static class RefWrapper {
String value = "";
}
@FunctionName("raceConditionTest")
public synchronized HttpResponseMessage raceConditionTest(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS
),
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context
) throws IOException {
toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
Thread.sleep(1000 * 10);
return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
}
}
When I call this function 10 times in parallel, with a different value in the header, all ten requests return the same value, as is expected - a race condition is achieved. If I synchronise, as seen here:
@FunctionName("raceConditionTest")
public synchronized HttpResponseMessage raceConditionTest( /*args*/ ) {
synchronized (toReturn) {
toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
Thread.sleep(1000 * 10);
return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
}
}
and send parallel requests, then, as expected, each request returns the input value correctly, the race condition has been prevent.
However, unexpectedly, all requests return at the same time, they don't seem to queue. I've looked at my metrics, and no additional function instances are being created.
The Question
So why is this code not slow, why do requests not have to wait? I'm assuming this behaviour is related to the Azure Function runtime - is it guaranteed, documented, or reasonably expected to be stable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论