summaryrefslogtreecommitdiffstats
path: root/docs/en/ranch/2.0/guide/migrating_from_1.7/index.html
blob: c943efaed2e2ba8cebeaaaf19001ad6a3e6bdd60 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">

    <title>Nine Nines: Migrating from Ranch 1.7 to Ranch 2.0</title>

    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
    <link href="/css/99s.css?r=7" rel="stylesheet">

    <link rel="shortcut icon" href="/img/ico/favicon.ico">
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
    <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">

    
</head>


<body class="">
  <header id="page-head">
    <div id="topbar" class="container">
        <div class="row">
          <div class="span2">
            <h1 id="logo"><a href="/" title="99s">99s</a></h1>
          </div>
          <div class="span10">
            
            <div id="side-header">
              <nav>
                <ul>
                  <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
  				  <li><a title="Watch my talks" href="/talks">Talks</a></li>
  				  <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
  				  <li><a title="Request my services" href="/services">Consulting & Training</a></li>
                </ul>
              </nav> 
              <ul id="social">
                <li>
                  <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
                </li>
                    <li>
						<a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
					</li>
              </ul>
            </div>
          </div>
        </div>
    </div>


</header>

<div id="contents" class="two_col">
<div class="container">
<div class="row">
<div id="docs" class="span9 maincol">

<h1 class="lined-header"><span>Migrating from Ranch 1.7 to Ranch 2.0</span></h1>

<p>Ranch 2.0 adds support for multiple connection supervisors.</p>
<p>Ranch 1.x had a bottleneck because it used only a single connection supervisor. This was more evident when many connections were dropped at once as the supervisor couldn&apos;t keep up and failed to accept new connections while cleaning up the old ones. Ranch 2.0 behaves much better in this scenario by default. Multiple connection supervisors also helps with concurrently accepting new connections.</p>
<p>Ranch 2.0 also adds experimental support for opening more than one listening socket on a single port.</p>
<p>Starting with Ranch 2.0 we are also providing a <a href="https://github.com/juhlig/prometheus_ranch">Prometheus collector</a> as a separate project as well as a <a href="https://github.com/juhlig/prometheus_ranch/blob/master/dashboards/ranch-dashboard.json">Grafana dashboard</a>.</p>
<p>Ranch 2.0 is compatible with Erlang/OTP 21.0 onward. Support for Erlang/OTP 19 and 20 has been removed.</p>
<h2 id="_features_added">Features added</h2>
<ul><li>Ranch now comes with a <code>ranch.appup</code> file necessary for performing release upgrades. A test suite has been added to confirm release upgrades work from one tag to the next. Numerous fixes were made that will also improve error recovery. Release upgrades will only be supported from Ranch 2.0 onward.
</li>
<li>The <code>num_conns_sups</code> option has been added. It allows configuring the number of connection supervisors. It now defaults to <code>num_accceptors</code>. The old behavior can be obtained by setting this value to 1.
</li>
<li>The <code>logger</code> option is no longer experimental. It now defaults to <code>logger</code> instead of <code>error_logger</code>.
</li>
<li>UNIX domain sockets are now supported.
</li>
<li>The active N socket option is now supported. It requires Erlang/OTP 21.3 or above for TLS, however.
</li>
<li>Embedded listeners are now failing in a predictable manner when <code>ranch_server</code> goes down. It is no longer necessary to embed <code>ranch_sup</code> and the recommendation is now to just start Ranch normally when using embedded listeners.
</li>
<li>Two steps handshake is now supported. This allows obtaining TLS extensions and updating options before resuming the handshake. The handshake can also be canceled.
</li>
</ul>
<h2 id="_experimental_features_added">Experimental features added</h2>
<ul><li>The experimental <code>num_listen_sockets</code> option has been added. It allows opening more than one listening socket per listener. It can only be used alongside the Linux <code>SO_REUSEPORT</code> socket option or equivalent. It allows working around a bottleneck in the kernel and maximizes resource usage, leading to increased rates for accepting new connections.
</li>
</ul>
<h2 id="_features_removed">Features removed</h2>
<ul><li>The <code>socket</code> option was removed. A more viable solution is to define a custom transport module that returns a fresh socket when <code>Transport:listen/1</code> is called.
</li>
</ul>
<h2 id="_changed_behaviors">Changed behaviors</h2>
<ul><li>The callback function <code>Transport:listen/1</code> and its implementations in <code>ranch_tcp</code> and <code>ranch_ssl</code> have changed to accept a map of transport options instead of only socket options.
</li>
<li>The callback function <code>Transport:messages/0</code> return value now includes the tag used for passive messages.
</li>
<li>The <code>Socket</code> argument was removed from <code>Protocol:start_link/3</code>. The socket must now be obtained by calling <code>ranch:handshake/1,2</code>.
</li>
</ul>
<h2 id="_added_functions">Added functions</h2>
<ul><li>The functions <code>ranch:handshake_continue/1,2</code> and <code>ranch:handshake_cancel/1</code> can be used to perform a two steps handshake. These functions may not be supported by all transports.
</li>
</ul>
<h2 id="_changed_functions">Changed functions</h2>
<ul><li>The <code>NumAcceptors</code> argument was removed from <code>ranch:start_listener/5</code> and <code>ranch:child_spec/5</code> and moved to the transport options.
</li>
<li>Ranch options can no longer be passed along with socket options as a proplist. The only forms allowed are now the <code>ranch:opts()</code> map or only socket options as-is. Individual transport options are now validated as well. The <code>ranch:opts()</code> map must be used when socket options also use a map. This applies to the <code>ranch:start_listener/5</code>, <code>ranch:child_spec/5</code> and <code>ranch:set_transport_options/2</code> functions.
</li>
<li>The function <code>ranch:info/1,2</code> now returns a map containing each listener&apos;s information rather than a list of key/values. The key <code>num_acceptors</code> was removed as it can be found in the transport options.
</li>
<li>The function <code>ranch:set_transport_options/2</code> no longer requires the listener to be suspended. Which options apply immediately, on suspend/resume or on restart has been documented. Some work has also been done to make these option changes more predictable.
</li>
</ul>
<h2 id="_removed_functions">Removed functions</h2>
<ul><li>The function <code>ranch:accept_ack/1</code> has been removed in favor of <code>ranch:handshake/1,2</code>.
</li>
</ul>
<h2 id="_bugs_fixed">Bugs fixed</h2>
<ul><li>Calling <code>ranch:remove_connection/1</code> will now resume a sleeping acceptor process when applicable.
</li>
<li>Repeatedly calling <code>ranch:remove_connection/1</code> from a connection process would crash the respective connection supervisor. This has now been fixed.
</li>
<li>When a connection process was failing to start, the socket was not closed and this lead to leaking sockets. This is now corrected.
</li>
</ul>
<h2 id="_other_changes">Other changes</h2>
<ul><li>Connection draining has now been documented in the guide following user feedback and discussions.
</li>
<li>Ranch is now tested against <a href="https://concuerror.com/">Concuerror</a>, a model checking tool for debugging, testing and verifying concurrent Erlang programs. Two tests have been added in this release and more will follow in the future.
</li>
<li>Ranch is now tested against <code>stampede</code>, a chaos monkey style testing tool. Currently includes three scenarios: normal TCP and TLS listeners and embedded TCP listener. This new test suite helped uncover a misplaced <code>monitor/2</code> call added during the development of Ranch 2.0 (we were using a similar tool, <code>havoc</code>, at the time of finding that issue).
</li>
<li>The supervisor for acceptors and the parent supervisor for connection supervisors now have an adaptive restart intensity limit set to <code>1 + ceil(math:log2(NumChildren))</code> to allow room for errors when they have many children.
</li>
<li>Ranch now uses stricter compiler options. Missing function specs were added to internal modules.
</li>
<li>Ranch now calls <code>ssl:handshake/1,2,3</code> instead of <code>ssl:ssl_accept/1,2</code>.
</li>
<li>The <code>ranch_ssl:ssl_opt()</code> type has been updated to conform with Erlang/OTP 22.0.
</li>
</ul>




	
		
		
		
		
		

		<nav style="margin:1em 0">
			
				<a style="float:left" href="https://ninenines.eu/docs/en/ranch/2.0/guide/internals/">
					Internals
				</a>
			

			
				<a style="float:right" href="https://ninenines.eu/docs/en/ranch/2.0/guide/migrating_from_1.6/">
					Migrating from Ranch 1.6 to 1.7
				</a>
			
		</nav>
	



</div>

<div class="span3 sidecol">


<h3>
	Ranch
	2.0
	
	User Guide
</h3>

<ul>
	
		<li><a href="/docs/en/ranch/2.0/guide">User Guide</a></li>
	
	
		<li><a href="/docs/en/ranch/2.0/manual">Function Reference</a></li>
	
	
</ul>

<h4 id="docs-nav">Navigation</h4>

<h4>Version select</h4>
<ul>
	
	
	
		<li><a href="/docs/en/ranch/2.0/guide">2.0</a></li>
	
		<li><a href="/docs/en/ranch/1.7/guide">1.7</a></li>
	
		<li><a href="/docs/en/ranch/1.6/guide">1.6</a></li>
	
		<li><a href="/docs/en/ranch/1.5/guide">1.5</a></li>
	
		<li><a href="/docs/en/ranch/1.4/guide">1.4</a></li>
	
</ul>

<h3 id="_like_my_work__donate">Like my work? Donate!</h3>
<p>Donate to Loïc Hoguin because his work on Cowboy, Ranch, Gun and Erlang.mk is fantastic:</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" style="display:inline">
<input type="hidden" name="cmd" value="_donations">
<input type="hidden" name="business" value="[email protected]">
<input type="hidden" name="lc" value="FR">
<input type="hidden" name="item_name" value="Loic Hoguin">
<input type="hidden" name="item_number" value="99s">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="bn" value="PP-DonationsBF:btn_donate_LG.gif:NonHosted">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form><p>Recurring payment options are also available via <a href="https://github.com/sponsors/essen">GitHub Sponsors</a>. These funds are used to cover the recurring expenses like food, dedicated servers or domain names.</p>



</div>
</div>
</div>
</div>

      <footer>
        <div class="container">
          <div class="row">
            <div class="span6">
              <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
              <nav>
                <ul>
                  <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
                </ul>
              </nav>
            </div>
            <div class="span6 credits">
               <p><img src="/img/footer_logo.png"></p>
               <p>Copyright &copy; Loïc Hoguin 2012-2018</p>
            </div>
          </div>
        </div>
      </footer>

    
    <script src="/js/custom.js"></script>
  </body>
</html>