Skip to content

Commit

Permalink
added section about task-callback bridge
Browse files Browse the repository at this point in the history
  • Loading branch information
pihai committed Mar 12, 2017
1 parent 57570d6 commit 36c1920
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
25 changes: 25 additions & 0 deletions doc/thesis/chapters/serverless.tex
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,31 @@ \subsubsection{Übersetzungsvorgang}

Wesentlich aufwändiger gestaltet sich die Interaktion mit der \textit{Web Jobs SDK}, bei Sprachen die nicht der .NET"=Familie angehören. Bei JavaScript Funktionen beispielsweise, ist eine Brücke zwischen der .NET \textit{Common Language Runtime} und der \textit{JavaScript}-Laufzeitumgebungen notwendig. Dieses Problem löst eine Bibliothek mit dem Namen \textit{Edge.js}. Damit ist es möglich, .NET und \textit{Node.js} Quellcode im selben Prozess auszuführen, indem beide Laufzeiten im selben Prozess geladen werden \cite{EdgeJs}. Das ist wesentlich effizienter, als beide Umgebungen getrennt auszuführen und über Interprozesskommunikation zu verbinden.

Die Programmiermodelle von .NET und \textit{Node.js} unterscheiden sich in manchen Punkten gravierend. In \textit{Node.js} wird Nebenläufigkeit beispielsweise durch Callback-basierte Programmierung gelöst, weil die virtuelle JavaScript-Maschine nur einen einzigen Ausführungsstrang nutzt. In .NET gibt es diese Einschränkung nicht. Hier wird Task-basierte Nebenläufigkeit bevorzugt. Programm \ref{prog:dotnet-javascript-bridge} zeigt aber, dass beide Konzepte isomorph sind und sich darum trotzdem gut verbinden lassen.

\begin{program}[!hbt]
\caption{Brücke zwischen Task-basierter Programmierung in .NET und Callback-basierter Programmierung in JavaScript}
\label{prog:dotnet-javascript-bridge}
\noindent\begin{minipage}[t]{.48\textwidth}
\lstset{showlines=true}
\begin{GenericCode}
Func</+\textcolor{red}{object}+/, /+\textcolor{cyan}{Task}+/</+\textcolor{olive}{object}> >


\end{GenericCode} % leave empty lines!!!

\end{minipage}\hfill
\begin{minipage}[t]{.48\textwidth}
\lstset{showlines=true}
\begin{GenericCode}
function (/+\textcolor{red}{arguments}+/, /+\textcolor{cyan}{callback}+/) {
callback(/+\textcolor{cyan}{error}+/, /+\textcolor{olive}{result}+/);
}
\end{GenericCode}

\end{minipage}
\end{program}

Die Kompilierung oder Interpretation der Job Funktion zur Laufzeit, ermöglicht ein sehr effizientes ausrollen dieser Funktionen. Es muss nicht die ganze Host-Anwendung neu übersetzt und Ausgerollt werden, wie es bei den in Abschnitt \ref{subsec:webjobssdk} beschriebenen traditionellen \textit{Web Jobs} der Fall war.

\subsection{Azure Function App}
Expand Down
2 changes: 1 addition & 1 deletion doc/thesis/hgblistings.sty
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ keepspaces=true,%
commentstyle={},
texcl=false,
escapechar={},
escapeinside={},
escapeinside={/+}{+/},
#1}}
{}

Expand Down
21 changes: 21 additions & 0 deletions src/azure-fun-tests/cold-starts/result-visu.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ let cnnStr =

let entries = downlaodTableToCsv cnnStr "coldStartTiming" "nix"

entries.Length

let avgPerRegion =
entries
|> List.groupBy (fun x -> x.Location)
Expand All @@ -62,3 +64,22 @@ let avgPerRegion =
key, Statistics.FiveNumberSummary samples
)

let dateStart = entries |> List.map (fun x -> x.Timestamp) |> List.min
let dateEnd = entries |> List.map (fun x -> x.Timestamp) |> List.max

let dateRange = dateEnd - dateStart

let latex =
avgPerRegion
|> List.map (fun (reg, stats) ->
reg,
stats
|> Seq.zip ["lower whisker"; "lower quartile"; "mediae"; "upper quartile"; "upper whisker"]
|> Seq.map (fun (name, value) -> sprintf "%s=%.2f" name value)
|> String.concat ", "
)

latex |> List.iter (printf "%A")



0 comments on commit 36c1920

Please sign in to comment.