Skip to content

Commit 96d6f48

Browse files
authored
Merge pull request #110 from sangria-graphql/new_doc
generating new doc
2 parents 735f05b + 0d7997b commit 96d6f48

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

docs/learn/index.html

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3047,6 +3047,74 @@ <h3 id="determine-a-query-operation-type">Determine a Query Operation Type</h3>
30473047

30483048
<p>Sometimes it can be very useful to know the type of query operation. For example you need it if you want to return a different response for subscription queries. <code class="language-plaintext highlighter-rouge">ast.Document</code> exposes <code class="language-plaintext highlighter-rouge">operationType</code> and <code class="language-plaintext highlighter-rouge">operation</code> for this.</p>
30493049

3050+
<h2 id="performance-tips">Performance tips.</h2>
3051+
3052+
<p>Sangria is being used by several companies on production since several years and capable of handling a lot of traffic.</p>
3053+
3054+
<p>Sangria is indeed a fast library. If you want to take the maximum out of it, here are some guidelines and tips.</p>
3055+
3056+
<h3 id="compute-the-schema-only-once">Compute the schema only once</h3>
3057+
3058+
<p>Make sure that you only compute the schema once. This easiest way is to use a singleton object to define the schema:</p>
3059+
3060+
<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">object</span> <span class="nc">GraphQLSchema</span> <span class="o">{</span>
3061+
<span class="k">val</span> <span class="nv">QueryType</span> <span class="k">=</span> <span class="o">???</span>
3062+
<span class="k">val</span> <span class="nv">MutationType</span> <span class="k">=</span> <span class="o">???</span>
3063+
<span class="k">val</span> <span class="nv">schema</span> <span class="k">=</span> <span class="nc">Schema</span><span class="o">(</span><span class="nc">QueryType</span><span class="o">,</span> <span class="nc">Some</span><span class="o">(</span><span class="nc">MutationType</span><span class="o">))</span>
3064+
<span class="o">}</span>
3065+
</code></pre></div></div>
3066+
3067+
<p>If you compute the schema at each request, you will lose a lot of performances.</p>
3068+
3069+
<h3 id="load-the-schema-before-the-first-request">Load the schema before the first request</h3>
3070+
3071+
<p>If you are using a web server, make sure that you load the schema before the first request.
3072+
This way, all classes will be loaded before the web server starts and the first request will not be slower than the others.</p>
3073+
3074+
<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">object</span> <span class="nc">Main</span> <span class="k">extends</span> <span class="nc">App</span> <span class="o">{</span>
3075+
<span class="k">val</span> <span class="nv">schema</span> <span class="k">=</span> <span class="nv">GraphQLSchema</span><span class="o">.</span><span class="py">schema</span>
3076+
3077+
<span class="c1">// start the server</span>
3078+
<span class="o">}</span>
3079+
</code></pre></div></div>
3080+
3081+
<h3 id="use-the-parasitic-executioncontext-expert">Use the <code class="language-plaintext highlighter-rouge">parasitic</code> ExecutionContext (expert)</h3>
3082+
3083+
<p>Sangria uses <code class="language-plaintext highlighter-rouge">Future</code> to handle asynchronous operations. When you execute a query, you need to pass an <code class="language-plaintext highlighter-rouge">ExecutionContext</code>.</p>
3084+
3085+
<p>One way to improve performances is to use the <code class="language-plaintext highlighter-rouge">scala.concurrent.ExecutionContext.parasitic</code> ExecutionContext.
3086+
But be careful that this ExecutionContext will propagate everywhere, including in the <code class="language-plaintext highlighter-rouge">DeferredResolver</code> where it might not be the best option. You might be using the wrong thread pool for IO operations.</p>
3087+
3088+
<p>To avoid this, you can pack the ExecutionContext in your Context and use it in the <code class="language-plaintext highlighter-rouge">DeferredResolver</code>:</p>
3089+
3090+
<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">object</span> <span class="nc">DeferredReferenceResolver</span> <span class="k">extends</span> <span class="nc">DeferredResolver</span><span class="o">[</span><span class="kt">Context</span><span class="o">]</span> <span class="o">{</span>
3091+
<span class="k">def</span> <span class="nf">resolve</span><span class="o">(</span>
3092+
<span class="n">deferred</span><span class="k">:</span> <span class="kt">Vector</span><span class="o">[</span><span class="kt">Deferred</span><span class="o">[</span><span class="kt">Any</span><span class="o">]],</span>
3093+
<span class="n">ctx</span><span class="k">:</span> <span class="kt">Context</span><span class="o">,</span>
3094+
<span class="n">queryState</span><span class="k">:</span> <span class="kt">Any</span>
3095+
<span class="o">)(</span><span class="k">implicit</span> <span class="n">ec</span><span class="k">:</span> <span class="kt">ExecutionContext</span><span class="o">)</span><span class="k">:</span> <span class="kt">Vector</span><span class="o">[</span><span class="kt">Future</span><span class="o">[</span><span class="kt">Any</span><span class="o">]]</span> <span class="k">=</span>
3096+
<span class="nf">resolveInternal</span><span class="o">(</span><span class="n">deferred</span><span class="o">,</span> <span class="n">ctx</span><span class="o">)</span>
3097+
3098+
<span class="k">private</span> <span class="k">def</span> <span class="nf">resolveInternal</span><span class="o">(</span>
3099+
<span class="n">deferred</span><span class="k">:</span> <span class="kt">Vector</span><span class="o">[</span><span class="kt">Deferred</span><span class="o">[</span><span class="kt">Any</span><span class="o">]],</span>
3100+
<span class="n">ctx</span><span class="k">:</span> <span class="kt">Context</span>
3101+
<span class="o">)</span><span class="k">:</span> <span class="kt">Vector</span><span class="o">[</span><span class="kt">Future</span><span class="o">[</span><span class="kt">Any</span><span class="o">]]</span> <span class="k">=</span> <span class="o">{</span>
3102+
<span class="c1">// for IO, uses non-parasitic ExecutionContext</span>
3103+
<span class="k">implicit</span> <span class="k">val</span> <span class="nv">ec</span><span class="k">:</span> <span class="kt">ExecutionContext</span> <span class="o">=</span> <span class="nv">ctx</span><span class="o">.</span><span class="py">executionContext</span>
3104+
<span class="o">???</span>
3105+
<span class="o">}</span>
3106+
<span class="o">}</span>
3107+
3108+
<span class="nc">Object</span> <span class="nc">GraphQLSchema</span> <span class="o">{</span>
3109+
<span class="k">val</span> <span class="nv">schema</span> <span class="k">=</span> <span class="nc">Schema</span><span class="o">(</span><span class="nc">QueryType</span><span class="o">,</span> <span class="n">deferredResolver</span> <span class="k">=</span> <span class="nc">DeferredReferenceResolver</span><span class="o">)</span>
3110+
<span class="k">def</span> <span class="nf">execute</span><span class="o">(</span><span class="n">ctx</span><span class="k">:</span> <span class="kt">Context</span><span class="o">,</span> <span class="n">query</span><span class="k">:</span> <span class="kt">Document</span><span class="o">)</span><span class="k">:</span> <span class="kt">Future</span><span class="o">[</span><span class="kt">Json</span><span class="o">]</span> <span class="o">{</span>
3111+
<span class="c1">// just for internal execution, uses parasitic ExecutionContext</span>
3112+
<span class="k">implicit</span> <span class="k">val</span> <span class="nv">ec</span> <span class="k">=</span> <span class="nv">scala</span><span class="o">.</span><span class="py">concurrent</span><span class="o">.</span><span class="py">ExecutionContext</span><span class="o">.</span><span class="py">parasitic</span>
3113+
<span class="nv">Executor</span><span class="o">.</span><span class="py">execute</span><span class="o">(</span><span class="n">schema</span><span class="o">,</span> <span class="n">query</span><span class="o">)</span>
3114+
<span class="o">}</span>
3115+
<span class="o">}</span>
3116+
</code></pre></div></div>
3117+
30503118
</div>
30513119

30523120
<nav class="col-md-3 bs-docs-sidebar" id="sidebar"></nav>

0 commit comments

Comments
 (0)