-
Notifications
You must be signed in to change notification settings - Fork 1
/
faq.html
3073 lines (2956 loc) · 165 KB
/
faq.html
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<title>CloudI: A Cloud at the lowest level - Frequently Asked Questions</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta content="Cloud Framework for fault-tolerant distributed processing with dynamic load balancing" name="description" />
<meta content="faq, cloud, private cloud, framework, erlang, fault tolerant, distributed systems, embarrassingly parallel, divide and conquer, cloudi" name="keywords" />
<meta content="global" name="distribution" />
<script src="style.js"></script>
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="shortcut icon" href="images/cloud.ico" type="image/x-icon" />
<!-- Open Graph Protocol (OGP) with LinkedIn requirements -->
<meta property="og:title" content="CloudI: A Cloud at the lowest level - Frequently Asked Questions" />
<meta property="og:description" content="CloudI is an open-source private cloud computing framework for efficient, secure, and internal data processing. CloudI provides scaling for previously unscalable source code with efficient fault-tolerant execution of ATS, C/C++, Erlang/Elixir, Go, Haskell, Java, JavaScript/node.js, OCaml, Perl, PHP, Python, Ruby, or Rust services.
The bare essentials for efficient fault-tolerant processing on a cloud!" />
<meta property="og:image" content="https://cloudi.org/images/cloud_ogp.png" />
<meta property="og:url" content="https://cloudi.org/faq.html" />
<meta property="og:type" content="website" />
</head>
<body>
<div id="header">
<a href="index.html">
Cloud<span style="font-family:serif">I</span><img alt="Active Cloud" width="156" height="106" src="images/cloud.png" />
</a>
</div>
<br />
<div id="navigation">
<ul>
<li><a href="api.html">API</a></li>
<li><a href="faq.html" class="active">FAQ</a></li>
<li><a href="tutorials.html">Tutorials</a>
(<a href="tutorial_java.html">Java</a>)</li>
<li><a href="download" rel="noopener" target="_blank">Download</a></li>
<li><a href="https://github.com/CloudI/CloudI/tree/develop#readme">Source</a></li>
<li><a href="support.html">Support</a></li>
</ul>
</div>
<div id="content">
<h1>Frequently Asked Questions</h1>
<h3 style="text-align:center">version 2.0.7<br />
last updated on January 11<sup>th</sup> 2024</h3>
<h2 id="1_contents">1 - Introduction to CloudI</h2>
<ul class="faq">
<li><a href="#1_Name" >1.1 - Why is it named "Cloud<span style="font-family:serif">I</span>"?</a></li>
<li><a href="#1_Pronounce" >1.2 - How is CloudI pronounced?</a></li>
<li><a href="#1_Clouds" >1.3 - How does CloudI compare to other "Clouds"?</a></li>
<li><a href="#1_Messaging" >1.4 - How does CloudI compare to other open source messaging?</a></li>
<li><a href="#1_WhatIs" >1.5 - What is CloudI?</a></li>
<li><a href="#1_OS" >1.6 - On what Operating Systems does CloudI run?</a></li>
<li><a href="#1_Commercial" >1.7 - Is Commercial support available for CloudI?</a></li>
<li><a href="#1_ReallyFree" >1.8 - Is CloudI really free?</a></li>
<li><a href="#1_WhoDevelops" >1.9 - Who develops CloudI?</a></li>
<li><a href="#1_PrivateCloud" >1.10 - Can I use CloudI as a Private Cloud?</a></li>
<li><a href="#1_OnlineService">1.11 - Can I use CloudI as an Online Service?</a></li>
<li><a href="#1_CAP" >1.12 - What CAP theorem guarantees does CloudI provide?</a></li>
<li><a href="#1_Actor" >1.13 - Does CloudI provide an implementation of the Actor Model?</a></li>
<li><a href="#1_REST" >1.14 - Does CloudI support REST?</a></li>
<li><a href="#1_SOA" >1.15 - Does CloudI provide a Service-Oriented Architecture (SOA)</a></li>
<li><a href="#1_Microservices">1.16 - Does CloudI provide a Microservice Architecture?</a></li>
<li><a href="#1_Reactive" >1.17 - Is CloudI Reactive?</a></li>
<li><a href="#1_Sagas" >1.18 - Does CloudI support Sagas?</a></li>
<li><a href="#1_HowAbout" >1.19 - Why doesn't CloudI integrate with ProductX?</a></li>
</ul>
<h2 id="2_contents">2 - Learning about CloudI</h2>
<ul class="faq">
<li><a href="#2_WebPages" >2.1 - Web Pages</a></li>
<li><a href="#2_MailingList" >2.2 - Mailing List</a></li>
<li><a href="#2_IRC" >2.3 - Internet Relay Chat (IRC)</a></li>
<li><a href="#2_RSS" >2.4 - RSS Feeds</a></li>
<li><a href="#2_Twitter" >2.5 - Twitter</a></li>
<li><a href="#2_Presentations" >2.6 - Presentations</a></li>
<li><a href="#2_Articles" >2.7 - Articles</a></li>
<li><a href="#2_ReportingBugs" >2.8 - Reporting Bugs</a></li>
<li><a href="#2_CodeOfConduct" >2.9 - Code of Conduct</a></li>
</ul>
<h2 id="3_contents">3 - CloudI Installation Guide</h2>
<ul class="faq">
<li><a href="#3_Overview" >3.1 - Overview</a></li>
<li><a href="#3_Options" >3.2 - Installation Options</a></li>
<li><a href="#3_OSX" >3.3 - OS X Installation</a></li>
<li><a href="#3_Running" >3.4 - Running CloudI</a></li>
<li><a href="#3_Config" >3.5 - Configuration</a></li>
</ul>
<h2 id="4_contents">4 - General Questions</h2>
<ul class="faq">
<li><a href="#4_API" >4.1 - How do I integrate external software with CloudI?</a></li>
<li><a href="#4_ServiceAPI" >4.2 - How do I control CloudI dynamically?</a></li>
<li><a href="#4_PubSub" >4.3 - How do I use Publisher/Subscriber messaging?</a></li>
<li><a href="#4_RPC" >4.4 - How do I use Remote Procedure Calls (RPC)?</a></li>
<li><a href="#4_WebServices">4.5 - How do I create Web Services?</a></li>
<li><a href="#4_WebSockets" >4.6 - Does CloudI support WebSockets?</a></li>
<li><a href="#4_ACLs" >4.7 - How do I use Access Control Lists (ACLs)?</a></li>
<li><a href="#4_ServiceFail">4.8 - How do I Migrate a Service from a Failed or Failing Node?</a></li>
<li><a href="#4_URLregex" >4.9 - Can I use Regular Expressions with Service Names (URLs)?</a></li>
<li><a href="#4_NamePattern">4.10 - How do Service Name Patterns work?</a></li>
<li><a href="#4_ThreadSafe" >4.11 - Is the CloudI API thread-safe?</a></li>
<li><a href="#4_Speed" >4.12 - How can CloudI requests take advantage of cache coherency, minimum network latency, and any logical grouping?</a></li>
<li><a href="#4_Erlang" >4.13 - Why not just use Erlang directly?</a></li>
<li><a href="#4_Null" >4.14 - What is a null response (How do timeouts occur)?</a></li>
</ul>
<h2 id="5_contents">5 - Migrating to CloudI</h2>
<ul class="faq">
<li><a href="#5_Performance">5.1 - Performance Considerations</a></li>
<li><a href="#5_Scalability">5.2 - Scalability Considerations</a></li>
<li><a href="#5_Stability" >5.3 - Stability and Fault Tolerance Considerations</a></li>
<li><a href="#5_Integration">5.4 - Integration Considerations</a></li>
<li><a href="#5_LoadTesting">5.5 - Load Testing</a></li>
</ul>
<h2 id="6_contents">6 - Services</h2>
<ul class="faq">
<li><a href="#6_ATS" >6.1 - ATS Service Implementation</a></li>
<li><a href="#6_C" >6.2 - C/C++ Service Implementation</a></li>
<li><a href="#6_Erlang" >6.3 - Erlang Service Implementation</a></li>
<li><a href="#6_Go" >6.4 - Go Service Implementation</a></li>
<li><a href="#6_Haskell" >6.5 - Haskell Service Implementation</a></li>
<li><a href="#6_Java" >6.6 - Java Service Implementation</a></li>
<li><a href="#6_JavaScript" >6.7 - JavaScript/node.js Service Implementation</a></li>
<li><a href="#6_OCaml" >6.8 - OCaml Service Implementation</a></li>
<li><a href="#6_Perl" >6.9 - Perl Service Implementation</a></li>
<li><a href="#6_PHP" >6.10 - PHP Service Implementation</a></li>
<li><a href="#6_Python" >6.11 - Python Service Implementation</a></li>
<li><a href="#6_Ruby" >6.12 - Ruby Service Implementation</a></li>
<li><a href="#6_Rust" >6.13 - Rust Service Implementation</a></li>
<li><a href="#6_HTTP" >6.14 - HTTP Integration</a></li>
<li><a href="#6_FaultTolerance">6.15 - Service Fault Tolerance</a></li>
<li><a href="#6_Monitoring" >6.16 - Service Monitoring</a></li>
</ul>
<h2 id="7_contents">7 - Troubleshooting</h2>
<ul class="faq">
<li><a href="#7_start" >7.1 - Why does CloudI stop shortly after being started?</a></li>
<li><a href="#7_slow" >7.2 - Why is CloudI making my Linux machine slow?</a></li>
<li><a href="#7_install" >7.3 - Why does my container or guest VM installation of CloudI have problems?</a></li>
<li><a href="#7_cpu" >7.4 - How can I control the CPU utilization of CloudI?</a></li>
</ul>
<hr>
<h2>1 - Introduction to CloudI</h2>
<h3 id="1_Name">1.1 - Why is it named "Cloud<span style="font-family:serif">I</span>"?</h3>
<p class="paragraph">
A <strong>Cloud</strong> is more dynamic than a 3 dimensional
<strong>Grid</strong> and is more ubiquitous than the legend of
<strong>Beowulf</strong>, so it is easy to understand why computing Clouds
are the next generation distributed systems. The relevant connotations the
word Cloud contains are: dynamic, supervision, intermingle, and points
(i.e., point clouds). Any computing Cloud should offer dynamic
configuration, should supervise processes in a fault-tolerant way,
offer easy integration and should support an arbitrarily large number
of processes (respectively). This project offers Cloud functionality
facilitated by <a href="https://en.wikipedia.org/wiki/Erlang_%28programming_language%29" rel="noreferrer" target="_blank">Erlang</a>.
</p>
<p class="paragraph">
CloudI has an "<span style="font-family:serif">I</span>" suffix for
several connotations: cloudy, one, interface, and independence.
CloudI is referred to as "A Cloud as an Interface" because
a light-weight interface facilitates Cloud functionality.
The interface supports multiple programming languages and is called the
<a href="api.html#Service" target="_blank">CloudI API</a>.
CloudI supports private cloud development and deployment,
so only one Cloud is necessary for Cloud functionality with implicit
security. CloudI is also able to facilitate online services and offers
extreme connection scalability.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Pronounce">1.2 - How is CloudI pronounced?</h3>
<p class="paragraph">
As "cloud-e" /klaʊdi/ (think: Cloud <a href="https://en.wikipedia.org/wiki/Erlang_%28programming_language%29" rel="noreferrer" target="_blank">Erlang</a>).
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Clouds">1.3 - How does CloudI compare to other "Clouds"?</h3>
<h4>Hypervisor "Clouds"</h4>
<p class="paragraph">
Hypervisor "Clouds" are the most popular type of Cloud because any
<a href="https://en.wikipedia.org/wiki/Legacy_software" rel="noreferrer" target="_blank">legacy</a>
source code can be put into an image (or container)
to reduce the resources required.
The <a href="https://en.wikipedia.org/wiki/Hypervisors" rel="noreferrer" target="_blank">Hypervisor</a>
has existed since 1965 when software was used on the IBM 360/65 to
emulate an IBM 7080 with computation time split between the separate modes.
Modern Hypervisors provide Operating System virtualization to more
fully utilize hardware resources. Using virtualization can provide
easier management of a <a href="https://en.wikipedia.org/wiki/Monolithic_system" rel="noreferrer" target="_blank">Monolithic Architecture</a>
so the source code's limitations can be managed without software
development and are instead an <a href="https://en.wikipedia.org/wiki/Information_management#Operationalising_Information_Management" rel="noreferrer" target="_blank">operations</a> concern.
</p>
<h4>CloudI as a “Programming Model for Cloud Computing”</h4>
<p class="paragraph">
CloudI was classified as a "Programming Model for Cloud Computing" in the
book: <a href="https://www.amazon.com/Essentials-Cloud-Computing-K-Chandrasekaran/dp/1482205432" rel="noreferrer" target="_blank">Chandrasekaran, K. "Essentials of Cloud Computing". Chapman and Hall/CRC, 2014. ISBN 978-1-4822-0543-5 (p198-199)</a>.
While the book does have various errors, it is a significant effort to
classify all the forms of Cloud Computing. CloudI use does require
software development for using the CloudI API which allows CloudI to
function as an application server and messaging bus with the
developed source code isolated within a service. However, CloudI
usage can exist with or without virtualization, offering both
development and deployment flexibility.
</p>
<p class="paragraph">
CloudI does not require using a particular online service and can be
deployed without an Internet connection on an <a href="https://en.wikipedia.org/wiki/Air_gap_%28networking%29" rel="noreferrer" target="_blank">airgap network</a>
if security is required. Scalability and fault tolerance are both
provided by CloudI's usage of the <a href="https://en.wikipedia.org/wiki/Erlang_%28programming_language%29" rel="noreferrer" target="_blank">Erlang programming language</a>.
Scalability is a natural gain with CloudI's Erlang
concurrency which reduces the amount of power and hardware necessary
for concurrent processing.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Messaging">1.4 - How does CloudI compare to other open source messaging?</h3>
<table><tr><td>
</td><td>
CloudI (core)
</td><td>
<a href="https://zeromq.org/" rel="noreferrer" target="_blank">ZeroMQ</a>
</td><td>
<a href="https://zookeeper.apache.org/" rel="noreferrer" target="_blank">Apache Zookeeper</a>
</td><td>
<a href="https://kafka.apache.org/" rel="noreferrer" target="_blank">Apache Kafka</a>
</td><td>
<a href="https://rabbitmq.com/" rel="noreferrer" target="_blank">RabbitMQ</a>
</td></tr><tr><td>
<a href="https://en.wikipedia.org/wiki/CAP_theorem" rel="noreferrer" target="_blank">CAP Theorem</a>
</td><td>
AP
</td><td>
AP
</td><td>
CP
</td><td>
CA
</td><td>
CA
</td></tr><tr><td>
Netsplits do not cause data loss
</td><td>
X
</td><td>
X
</td><td>
X
</td><td>
</td><td>
</td></tr><tr><td>
In‑memory transactions for minimum latency and maximum concurrency
</td><td>
X
</td><td>
</td><td>
</td><td>
</td><td>
</td></tr><tr><td>
Uniquely identifies transactions
</td><td>
X
</td><td>
</td><td>
X
</td><td>
X
</td><td>
X
</td></tr><tr><td>
Brokerless communication for minimum latency
</td><td>
X
</td><td>
X
</td><td>
</td><td>
</td><td>
</td></tr><tr><td>
Publish/Subscribe/RPC
</td><td>
X
</td><td>
X
</td><td>
</td><td>
X
</td><td>
X
</td></tr><tr><td>
<a href="#1_SOA">Protocol agnostic</a>
</td><td>
X
</td><td>
</td><td>
</td><td>
</td><td>
</td></tr><tr><td>
Complete transaction fault‑tolerance is provided within an application server
</td><td>
X
</td><td>
</td><td>
</td><td>
</td><td>
</td></tr><tr><td>
Execution thread fault‑tolerance granularity
</td><td>
X
</td><td>
</td><td>
</td><td>
</td><td>
</td></tr><tr><td>
Open Source license
</td><td>
MIT
</td><td>
LGPL
</td><td>
Apache
</td><td>
Apache
</td><td>
Mozilla Public
</td></tr></table>
<p class="paragraph">
CloudI is for <a href="https://en.wikipedia.org/wiki/Online_transaction_processing" rel="noreferrer" target="_blank">Online Transaction Processing (OLTP)</a>
where a transaction may not require database storage
(transient or cached data may allow the transaction to complete).
The processing of in-memory transactions is important for keeping
processing fault-tolerant so that errors are not persisted.
To pursue <a href="https://en.wikipedia.org/wiki/Fail-fast" rel="noreferrer" target="_blank">fail-fast</a>
design of fault-tolerant systems, a transaction's data would only be
persisted if it has passed all validation and business logic successfully.
</p>
<p class="paragraph">
CloudI provides fault tolerance on logic before a transaction is sent
for extreme reliability. Other messaging methods are only able to
timeout before the transaction is created without a way to escalate the
failure using fault tolerance constraints.
</p>
<p>
The fault tolerance constraints that CloudI provides are:
</p>
<table><tr><td>
initialization timeout
</td><td>
for startup validation
</td></tr><tr><td>
transaction timeouts
</td><td>
for individual transactions
</td></tr><tr><td>
termination timeout
</td><td>
for deterministic shutdowns
</td></tr><tr><td>
MaxR/MaxT
</td><td>
maximum restarts within a time period for any crashes within a
service instance process<br />
(a user-level or kernel-level thread)
</td></tr></table>
<p class="paragraph">
To make CloudI service requests durable (stored on the filesystem
during the lifetime of the transaction), the service requests can
be sent through
<a href="https://github.com/CloudI/CloudI/blob/master/src/lib/cloudi_service_queue/src/cloudi_service_queue.erl" rel="noopener" target="_blank">cloudi_service_queue</a>
to handle either a destination failure or both a source failure and
destination failure (based on the 'fault_isolation' configuration
argument being either 'destination' or 'both').
</p>
<p class="paragraph">
To make CloudI service requests consistent across multiple
service instances, the service requests can be sent through
<a href="https://github.com/CloudI/CloudI/blob/master/src/lib/cloudi_service_quorum/src/cloudi_service_quorum.erl" rel="noopener" target="_blank">cloudi_service_quorum</a>.
The service request responses will be checked to ensure the responses
pass the initialized quorum requirement and the service request will
fail (providing a <a href="faq.html#4_Null">null response</a>)
if quorum is not obtained during the service request timeout period.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_WhatIs">1.5 - What is CloudI?</h3>
<h4>Short Answer</h4>
<p class="paragraph">
A distributed application server that provides efficient messaging
for many programming languages within a single service abstraction
that is both scalable and fault-tolerant.
</p>
<h4>Shorter Answer</h4>
<p class="paragraph">
A rock-solid transaction processing system for
flexible software development.
</p>
<h4>Shortest Answer</h4>
<p class="paragraph">
A Cloud at the lowest level.
</p>
<h4>Long Answer</h4>
<p class="paragraph">
CloudI is an implementation of <a href="#1_Name">Cloud functionality</a>
that can be developed and deployed publicly or privately. CloudI provides
a simple server back-end that can be used for infrastructure development
of data processing systems, event processing systems, web services, and
combinations thereof. CloudI is a system that enforces <a href="https://en.wikipedia.org/wiki/Representational_State_Transfer" rel="noreferrer" target="_blank">RESTful development practices</a>
and provides a <a href="https://en.wikipedia.org/wiki/Service_oriented_architecture" rel="noreferrer" target="_blank">Service Oriented Architecture (SOA)</a>.
CloudI services communicate with messaging that can be controlled by simple
Access Control List (ACL) entries (to provide service communication
isolation).
</p>
<p class="paragraph">
CloudI was architected to easily integrate with other services, software,
and frameworks. The <a href="api.html#Service">CloudI API</a>
provides a light-weight interface for
creating services in ATS, C++/C, Elixir, Erlang, Go, Haskell, Java,
JavaScript, OCaml, Perl, PHP, Python, Ruby, and Rust. By using
CloudI, external software can become more scalable and fault-tolerant
by utilizing CloudI's load balancing of CloudI requests. CloudI
messaging enforces realtime constraints using timeouts, so that request
failures can be handled locally within the service where they are most
relevant. ACL entries explicitly allow or deny communication between
services and are a simple method of isolating critical services from
potentially volatile services. All CloudI API usage in languages other
than Erlang receive the isolation of Operating System processes
and are called external services. External services can utilize the
CloudI API with any threading library to achieve greater scalability and
reduce internal latency. The Erlang/Elixir CloudI API is used to create
internal services which utilize light-weight Erlang processes.
<a href="#6_contents">Examples of using the CloudI API</a>
are provided as integration tests or internal services.
</p>
<p class="paragraph">
The <a href="api.html#CloudI">CloudI Service API</a>
provides dynamic configuration which is accessible from any
allowed CloudI service (i.e., allowed based on the ACL entries). The
CloudI Service API is accessible remotely by using Erlang terms or JSON-RPC
over HTTP when using the cloudi_service_api_requests service with the
cloudi_service_http_cowboy service.
<a href="https://github.com/CloudI/CloudI/tree/master/src/service_api#readme" rel="noopener" target="_blank">Examples of using the CloudI Service API</a>
are provided as separate integration tests.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_OS">1.6 - On what Operating Systems does CloudI run?</h3>
<p class="paragraph">
CloudI runs on UNIX-based operating systems like Linux (<a href="https://ubuntu.com/" rel="noreferrer" target="_blank">Ubuntu</a>, etc.)
and BSDs (<a href="https://www.freebsd.org/" rel="noreferrer" target="_blank">FreeBSD</a>, <a href="https://www.openbsd.org/" rel="noreferrer" target="_blank">OpenBSD</a>, <a href="https://netbsd.org/" rel="noreferrer" target="_blank">NetBSD</a>, <a href="https://en.wikipedia.org/wiki/MacOS" rel="noreferrer" target="_blank">macOS</a>, etc.).
CloudI development has primarily taken place on Ubuntu and other
Operating Systems may not be completely tested yet.
</p>
<p class="paragraph">
<a href="https://www.erlang.org/doc/installation_guide/install" rel="noreferrer" target="_blank">Erlang</a>
must be able to run on the system for CloudI to function properly.
So, checking Erlang support would be a good place to start if you are
experimenting with a different Operating System. The information here
will be updated as more Operating Systems are tested.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Commercial">1.7 - Is Commercial support available for CloudI?</h3>
<ul>
<li>Integration Development</li>
<li>Operations Maintenance</li>
</ul>
<p>
Contact <a href="mailto:mjtruog(at)protonmail;dot;com">Michael Truog</a>
if you are interested in commercial CloudI support.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_ReallyFree">1.8 - Is CloudI really free?</h3>
<p class="paragraph">
CloudI is completely free. CloudI uses a <a href="LICENSE.txt" target="_blank">MIT license</a>
which permits reuse for personal or commercial purposes.
All external source code dependencies are also under a
commercial-friendly license
(<a href="https://en.wikipedia.org/wiki/MIT_License" rel="noreferrer" target="_blank">MIT</a>,
<a href="https://en.wikipedia.org/wiki/Apache_License" rel="noreferrer" target="_blank">Apache</a>).
Some dependencies used for building and testing use the GPL license
(autoconf/automake/libtool, autoconf macros, and
<a href="http://proper.softlab.ntua.gr/" rel="noreferrer" target="_blank">PropEr</a>).
For a more detailed look at the licenses of external dependencies,
please check the <a href="https://github.com/CloudI/CloudI/blob/master/src/external/README.markdown#readme" rel="noopener" target="_blank">src/external/README</a>
dependency list or the <a href="https://github.com/CloudI/CloudI/blob/master/src/NOTICE" rel="noopener" target="_blank">src/NOTICE</a> license list.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_WhoDevelops">1.9 - Who develops CloudI?</h3>
<p class="paragraph">
<a href="mailto:mjtruog(at)protonmail;dot;com">Michael Truog</a>
<a href="https://github.com/CloudI/CloudI/blob/master/src/AUTHORS" rel="noopener" target="_blank">and others</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_PrivateCloud">1.10 - Can I use CloudI as a Private Cloud?</h3>
<p class="paragraph">
Yes! CloudI provides everything for running a Cloud in isolation
(i.e., without a connection to the Internet). For more details,
please refer to <a href="#1_WhatIs">"1.5 - What is CloudI?"</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_OnlineService">1.11 - Can I use CloudI as an Online Service?</h3>
<p class="paragraph">
Yes! CloudI accepts incoming HTTP traffic and can be easily extended
to handle other incoming protocols. For more details,
please refer to <a href="#1_WhatIs">"1.5 - What is CloudI?"</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_CAP">1.12 - What CAP theorem guarantees does CloudI provide?</h3>
<p class="paragraph">
CloudI is an <a href="https://en.wikipedia.org/wiki/CAP_theorem" rel="noreferrer" target="_blank">AP-type distributed system</a>
(guarantees of Availability and Partition tolerance). A Consistency
guarantee (the guarantee not provided by CloudI) can be provided
by a database that is used within a CloudI service. All CloudI
<a href="api.html#Service">service requests</a> are transactional
and a service request response may be used to confirm any state change.
To understand consistency, as it relates to CloudI service
fault tolerance, please refer to <a href="#6_FaultTolerance">"6.15 - Service Fault Tolerance"</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Actor">1.13 - Does CloudI provide an implementation of the Actor Model?</h3>
<p class="paragraph">
At a high-level, both the Erlang VM and CloudI implement the Actor Model
when the term "Actor Model" is used loosely and the actors are allowed to
queue the messages they receive, before the messages are processed.
</p>
<p class="paragraph">
The Erlang VM has been referred to as implementing the
<a href="https://en.wikipedia.org/wiki/Actor_model" rel="noreferrer" target="_blank">Actor Model</a>
despite the <a href="https://erlang.org/pipermail/erlang-questions/2014-June/079794.html" rel="noreferrer" target="_blank">authors of Erlang being unaware of the Actor Model while implementing Erlang</a> (e.g., the paper by <a href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.226.5767" rel="noreferrer" target="_blank">Rajesh K. Karmani, Gul Agha, "Actors"</a>).
However, the Erlang VM does not provide the Actor
Model when working with the original definition of the Actor Model as it was
provided in <a href="https://ijcai.org/Past%20Proceedings/IJCAI-73/PDF/027B.pdf" rel="noreferrer" target="_blank">Carl Hewitt, Peter Bishop and Richard Steiger. "A Universal Modular Actor Formalism for Artificial Intelligence". IJCAI'73</a>.
Instead, the Erlang VM provides processes which are most similar to
"Fog Cutter Actors", based on the paper <a href="https://arxiv.org/abs/1008.1459" rel="noreferrer" target="_blank">by Carl Hewitt, "Actor Model of Computation: Scalable Robust Information Systems"</a>.
Unfortunately, no better term currently exists to refer to the design of
Erlang processes, aside from a comparison to a "Fog Cutter Actor".
</p>
<p class="paragraph">
CloudI services are similar to Erlang processes and Erlang processes are
used within the implementation of CloudI services. However, CloudI
services are more dynamic:
</p>
<ul>
<li>CloudI services use service names which match service name patterns. Service name patterns represent any number of CloudI service processes and service requests are automatically split between the available service processes, based on the sending service's destination refresh method. Erlang/OTP provides naming for Erlang processes, but the names must be unique, so only a one-to-one mapping is allowed.</li>
<li>CloudI services can be used transparently within non-Erlang programming languages, but Erlang processes are limited to the Erlang VM.</li>
<li>An asynchronous send within a CloudI service initialization can provide a response, which is not the case when using an Erlang process with an Erlang/OTP behaviour.</li>
<li>Erlang process creation is statically defined as part of a release creation process which provides a single boot file used during the lifetime of the Erlang VM. CloudI services are always dynamically added (or removed) based on the CloudI configuration and the <a href="api.html#CloudI">CloudI Service API</a> usage.</li>
<li><a href="#4_Erlang">etc.</a></li>
</ul>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_REST">1.14 - Does CloudI support REST?</h3>
<p class="paragraph">
Yes! CloudI is a system that enforces <a href="https://en.wikipedia.org/wiki/Representational_State_Transfer" rel="noreferrer" target="_blank">RESTful development practices</a>.
A common misconception is that REST requires HTTP usage
(see <a href="https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm" rel="noreferrer" target="_blank">Roy Fielding's thesis to understand why this is not the case</a>, <a href="https://www.ics.uci.edu/~taylor/documents/2002-REST-TOIT.pdf" rel="noreferrer" target="_blank">Fielding, Roy T.; Taylor, Richard N. (May 2002), "Principled Design of the Modern Web Architecture" (PDF), ACM Transactions on Internet Technology (TOIT) (New York: Association for Computing Machinery) 2 (2): 115–150, doi:10.1145/514183.514185, ISSN 1533-5399</a>).
In CloudI, service requests operate with <a href="https://en.wikipedia.org/wiki/Representational_state_transfer#Architectural_constraints" rel="noreferrer" target="_blank">REST architectural constraints</a> for better reliability and scalability than
an ad-hoc brittle server would provide.
For more details please refer to <a href="#1_WhatIs">"1.5 - What is CloudI?"</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_SOA">1.15 - Does CloudI provide a Service Oriented Architecture (SOA)?</h3>
<p class="paragraph">
Yes! CloudI provides a <a href="https://en.wikipedia.org/wiki/Service_oriented_architecture" rel="noreferrer" target="_blank">Service Oriented Architecture (SOA)</a>
for flexible development, deployment, and maintenance of
<a href="https://en.wikipedia.org/wiki/Enterprise_software" rel="noreferrer" target="_blank">Enterprise Software Applications (ESA)</a>.
CloudI provides an <a href="https://en.wikipedia.org/wiki/Enterprise_service_bus" rel="noreferrer" target="_blank">Enterprise Service Bus (ESB)</a>
which avoids latency overhead by avoiding serialization and conversions
of protocols like
<a href="https://kentonv.github.io/capnproto/" rel="noreferrer" target="_blank">Cap'n Proto</a>,
<a href="https://en.wikipedia.org/wiki/Protocol_Buffers" rel="noreferrer" target="_blank">Google Protocol Buffers</a>
(<a href="https://en.wikipedia.org/wiki/Asn.1" rel="noreferrer" target="_blank">ASN.1</a>
or <a href="https://en.wikipedia.org/wiki/DFDL" rel="noreferrer" target="_blank">DFDL</a>),
<a href="https://en.wikipedia.org/wiki/Representational_State_Transfer#Applied_to_Web_Services" rel="noreferrer" target="_blank">HTTP REST</a>
(with <a href="https://www.json.org/" rel="noreferrer" target="_blank">JSON</a>
or <a href="https://www.w3.org/TR/xml/" rel="noreferrer" target="_blank">XML</a>),
<a href="https://msgpack.org/" rel="noreferrer" target="_blank">MessagePack</a>,
<a href="https://bsonspec.org/" rel="noreferrer" target="_blank">BSON</a>,
<a href="https://en.wikipedia.org/wiki/SOAP" rel="noreferrer" target="_blank">SOAP</a>,
<a href="https://en.wikipedia.org/wiki/JSON_RPC" rel="noreferrer" target="_blank">JSON-RPC</a>,
<a href="https://en.wikipedia.org/wiki/Xmlrpc" rel="noreferrer" target="_blank">XML-RPC</a>,
<a href="https://en.wikipedia.org/wiki/Streaming_Text_Oriented_Messaging_Protocol" rel="noreferrer" target="_blank">STOMP</a>,
<a href="https://en.wikipedia.org/wiki/Corba" rel="noreferrer" target="_blank">CORBA</a>,
<a href="https://en.wikipedia.org/wiki/SunRPC" rel="noreferrer" target="_blank">Sun RPC</a>,
etc. and instead relies on the exchange of binary data between
heterogeneous services with the CloudI API.
</p>
<p class="paragraph">
CloudI service requests provide
<a href="https://en.wikipedia.org/wiki/Request-response" rel="noreferrer" target="_blank">Request/Reply</a>
(<a href="https://en.wikipedia.org/wiki/Remote_procedure_call" rel="noreferrer" target="_blank">RPC</a>),
<a href="https://en.wikipedia.org/wiki/Publish/subscribe" rel="noreferrer" target="_blank">Publish/Subscribe</a> and
<a href="https://en.wikipedia.org/wiki/Flow-based_programming" rel="noreferrer" target="_blank">Pipeline messaging (i.e., Flow-Based Programming (FBP))</a>.
CloudI supports both broker and broker-less
service requests with a distributed fault-tolerant service directory
(using "service names" and "service patterns")
that can be locally cached (when using a "lazy" destination refresh method,
instead of "immediate").
For more details please refer to <a href="#1_WhatIs">"1.5 - What is CloudI?"</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Microservices">1.16 - Does CloudI provide a Microservice Architecture?</h3>
<p class="paragraph">
Yes! CloudI provides <a href="https://martinfowler.com/articles/microservices.html" rel="noreferrer" target="_blank">Microservices</a>
using light-weight messaging to facilitate CloudI
<a href="#1_SOA">service requests</a> with the CloudI API.
HTTP integration is provided by
<a href="#6_HTTP">cloudi_service_http_cowboy</a>
(with other protocol integration relying on other CloudI services).
The service memory footprint is kept small by relying on Erlang processes
for their light-weight messaging (Erlang processes have been referred to
elsewhere as "Nanoservices").
</p>
<p class="paragraph">
The main requirements of a <a href="https://en.wikipedia.org/wiki/Microservices" rel="noreferrer" target="_blank">Microservices Architecture (MSA)</a> are:
</p>
<ul>
<li>Services must be <a href="api.html#2_services_update">easy to replace</a></li>
<li>Services are organized based on capabilities</li>
<li>Services can be implemented with heterogeneous technology transparently</li>
<li>All Service entities are equal rather than hierarchical (a property enforced by Inversion of Control (IoC) in a microservices framework)</li>
</ul>
<p class="paragraph">
CloudI services satisfy these requirements and are more fine-grained than
monolithic SOA services (many CloudI services can be used within a
single application rather than requiring an application be a service).
</p>
<p class="paragraph">
Using Erlang processes to provide a service abstraction allows all
service requests to be exchanged in a common way with external programming
language integration requiring only a thin interface
(an implementation of the CloudI API). The CloudI API imposes
<a href="#4_Erlang">no contention</a> on the extreme concurrency the
Erlang VM provides with CloudI's Erlang process integration.
For more details please refer to <a href="#1_WhatIs">"1.5 - What is CloudI?"</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Reactive">1.17 - Is CloudI Reactive?</h3>
<p class="paragraph">
Yes! CloudI is <a href="https://www.reactivemanifesto.org/" rel="noreferrer" target="_blank">Reactive</a>
due to the scalability and fault tolerance provided by Erlang combined
with the <a href="#1_REST">REST</a>
requirement of <a href="https://en.wikipedia.org/wiki/Representational_state_transfer#Stateless" rel="noreferrer" target="_blank">being stateless</a>
for service requests to provide event-driven, scalable, resilient and
responsive CloudI services.
</p>
<p class="paragraph">
To be specific, CloudI is an example of <a href="https://en.wikipedia.org/wiki/Functional_reactive_programming" rel="noreferrer" target="_blank">Functional Reactive Programming (FRP)</a>,
with CloudI service requests referred to as "signals" and each
service request handling function execution referred to as "events".
CloudI service request sends occur with a FRP "push-based" system
implementation.
</p>
<p class="paragraph">
To keep functional semantics in any programming language
that utilizes the CloudI API, separate function arguments are used
for each datum within the data of a service request when the
service request handling function is called
(with the function arity as 9 in Java, Perl, PHP, Ruby, 10 in Python,
11 in ATS, Erlang/Elixir, Go, Haskell, OCaml, Rust, 13 in C++ and 14 in C,
where arities higher than 9 are due to data handling details specific
to the programming languages).
Using a relatively high arity count does initially make developers
feel uncomfortable due to common Object-Oriented design considering it
a bad code-smell
(e.g., "Refactoring: Improving the Design of Existing Code"
by Martin Fowler et al. (Reading, MA: Addison-Wesley, 1999. Print)
mentions long parameter lists on page 78-79) though it does
help the developer naturally avoid side-effects as is commonly done
in functional programming with immutable data.
The use of a high arity count for CloudI service requests is
part of a consistent interface that the CloudI API provides in each
programming language (functions are common to all well-utilized
programming languages while objects are not).
</p>
<p class="paragraph">
When a <a href="api.html#1_subscribe">subscribe</a>d
callback function is called with the CloudI service request data,
the individual values are the most recent values. For example, the
timeout parameter in the service request is automatically decremented
based on the time that has elapsed before getting to the function
call. There are 3 constant parameters: the request type
(asynchronous or synchronous), the transaction id used to
identify the service request, and the source process identifier that
may receive the service request response, though all other parameters
can be changed with a call to
<a href="api.html#1_forward">forward</a> the service
request to a new callback function execution. For example,
the service name pattern may automatically change with a new
callback function execution even if the same service name is used for
the forward, due to the dynamic nature of service name pattern
subscriptions. The execution time spent within the callback function
is automatically decremented from the timeout value used for the
<a href="api.html#1_return">return</a>
or <a href="api.html#1_forward">forward</a>
if the <a href="api.html#2_services_add_config_opts">'request_timeout_adjustment' service configuration option</a>
is set to true (and the timeout value is not manually modified).
</p>
<p class="paragraph">
For more details please refer to <a href="#1_WhatIs">"1.5 - What is CloudI?"</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_Sagas">1.18 - Does CloudI support Sagas?</h3>
<p class="paragraph">
Yes! Sagas are easy to develop using CloudI. Sagas were first
described in the paper <a href="https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf" rel="noreferrer" target="_blank">Hector Garcia-Molina and Kenneth Salem. "Sagas". SIGMOD'87</a>.
Sagas have become a more prominent concept as microservice development
has become more popular due to the need to manage the complexity of
long-lived microservice transactions.
</p>
<p class="paragraph">
Typically, two approaches to Sagas is described:
</p>
<ul>
<li>Events/Choreography</li>
<li>Command/Orchestration</li>
</ul>
<p class="paragraph">
Either approach is possible in a CloudI service, though Sagas development
prefers the Command/Orchestration approach to avoid abstract complexity
that leads to implementation and maintenance difficulties that are
common with the Events/Choreography approach.
</p>
<p class="paragraph">
An Events/Choreography CloudI service implementation would rely on
<a href="api.html#1_subscribe">subscribe</a> use in each service,
for each event that needs to be received
(it would be best with a unique event for each receive to track
the transaction logic and decouple the receive from the concurrency of
each service).
The service would use <a href="api.html#1_forward">forward</a>
to transfer the control of a transaction to a different service and
any additional transactions may be sent using
<a href="api.html#1_send_async">send_async</a>
or <a href="api.html#1_send_sync">send_sync</a>
until the final transaction in the Saga
<a href="api.html#1_return">return</a>s a response.
</p>
<p class="paragraph">
A Command/Orchestration CloudI service implementation would centralize
the core Saga logic in a single CloudI service that uses
<a href="api.html#1_send_async">send_async</a>
or <a href="api.html#1_send_sync">send_sync</a>
to use any services necessary with separate transactions in the Saga.
Transactions in these other services could be joined together
by using <a href="api.html#1_forward">forward</a>
to transfer control of the transaction to the next service.
The core Saga logic would be based on the responses to the separate
transactions and would end the Saga by
<a href="api.html#1_return">return</a>ing a response.
</p>
<p class="paragraph">
With CloudI services providing transactions as a core feature
while managing the fault-tolerance and scalability of each
service independently, the resulting CloudI service business logic
is kept simple and easy to maintain. CloudI services are able to
avoid "boilerplate" source code that is required without CloudI
when handling timeouts and the propagation of timeout failures,
service failures or exceptions, service concurrency and other
common <a href="api.html#1_Intro">development</a> concerns.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<h3 id="1_HowAbout">1.19 - Why doesn't CloudI integrate with ProductX?</h3>
<p class="paragraph">
There are many possibilities for CloudI integration. If you know of a
public product that you think should be integrated or if you need
commercial support for a private product, contact
<a href="mailto:mjtruog(at)protonmail;dot;com">Michael Truog</a>.
</p>
<div class="top"><a href="#1_contents">Top</a></div>
<hr>
<h2>2 - Learning about CloudI</h2>
<h3 id="2_WebPages">2.1 - Web Pages</h3>
<table><tr><td>
Main Web Site:
</td><td>
<a href="https://cloudi.org">https://cloudi.org</a>
</td></tr><tr><td>
Source Code:
</td><td>
<a href="https://github.com/CloudI/CloudI#readme" rel="noopener" target="_blank">https://github.com/CloudI/CloudI</a>
</td></tr><tr><td>
Releases:
</td><td>
<a href="https://sourceforge.net/p/cloudi/activity" rel="noopener" target="_blank">https://sourceforge.net/p/cloudi/activity</a> <a href="https://github.com/CloudI/CloudI/tags" rel="noopener" target="_blank">(tags)</a>
</td></tr></table>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_MailingList">2.2 - Mailing List</h3>
<h4>New Mailing List</h3>
<table><tr><td>
Email Address:
</td><td>
<a href="mailto:cloudi-questions@lists.sourceforge.net" target="_blank">cloudi-questions@lists.sourceforge.net</a>
</td></tr><tr><td>
Subscribe:
</td><td>
<a href="https://sourceforge.net/projects/cloudi/lists/cloudi-questions" rel="noopener" target="_blank">https://sourceforge.net/projects/cloudi/lists/cloudi-questions</a>
</td></tr><tr><td>
Archive:
</td><td>
<a href="https://sourceforge.net/p/cloudi/mailman/cloudi-questions" rel="noopener" target="_blank">https://sourceforge.net/p/cloudi/mailman/cloudi-questions</a>
</td></tr></table>
<h4>Old Mailing List (version ≤ 2.0.6)</h3>
<table><tr><td>
Email Address:
</td><td>
<a href="mailto:cloudi-questions@lists.osdn.me" target="_blank">cloudi-questions@lists.osdn.me</a>
</td></tr><tr><td>
Subscribe:
</td><td>
<a href="https://lists.osdn.me/mailman/listinfo/cloudi-questions" rel="noopener" target="_blank">https://lists.osdn.me/mailman/listinfo/cloudi-questions</a>
</td></tr><tr><td>
Archive:
</td><td>
<a href="https://lists.osdn.me/mailman/archives/cloudi-questions" rel="noopener" target="_blank">https://lists.osdn.me/mailman/archives/cloudi-questions</a>
</td></tr></table>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_IRC">2.3 - Internet Relay Chat (IRC)</h3>
<table><tr><td>
IRC Server:
</td><td>
<a href="https://www.oftc.net/" rel="noreferrer" target="_blank">oftc.net</a>
</td></tr><tr><td>
Chat Room:
</td><td>
<a href="https://webchat.oftc.net/?randomnick=1&channels=cloudi" rel="noreferrer" target="_blank">#cloudi</a>
</td></tr></table>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_RSS">2.4 - RSS Feeds</h3>
<table><tr><td>
Development:
</td><td>
<a href="https://github.com/CloudI/CloudI/commits/develop.atom" rel="noopener" target="_blank">https://github.com/CloudI/CloudI/commits/develop.atom</a>
</td></tr><tr><td>
Releases:
</td><td>
<a href="https://sourceforge.net/p/cloudi/activity/feed.rss" rel="noopener" target="_blank">https://sourceforge.net/p/cloudi/activity/feed.rss</a> <a href="https://github.com/CloudI/CloudI/tags.atom" rel="noopener" target="_blank">(tags)</a>
</td></tr></table>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_Twitter">2.5 - Twitter</h3>
<table><tr><td>
Development:
</td><td>
<a href="https://twitter.com/cloudi_org" rel="noreferrer" target="_blank">@cloudi_org</a>
</td></tr></table>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_Presentations">2.6 - Presentations</h3>
<table>
<tr><td>
Version 1.5.0
</td><td>
<a href="docs/cloudi_meetup_chicago2015.pdf" target="_blank">2015 Chicago Erlang User Group (slides)</a>
</td></tr><tr><td>
Version 1.3.2b
</td><td>
<a href="docs/cloudi_meetup_seattle2014.pdf" target="_blank">2014 Erlang/Elixir Meetup Seattle (slides)</a>
</td></tr><tr><td>
Version 1.2.5b
</td><td>
<a href="docs/cloudi_hackntell_seattle2013.pdf" target="_blank">2013 Hack and Tell Seattle (slides)</a>
</td></tr><tr><td>
Version 1.0.0b
</td><td>
2012 Open Source Bridge Unconference
</td></tr><tr><td>
Version 0.1.6a
</td><td>
<a href="docs/cloudi_erlounge_vancouver2011.pdf" target="_blank">2011 ErLounge Meetup Vancouver BC (slides)</a>
</td></tr><tr><td>
Version 0.1.5a
</td><td>
<a href="docs/cloudi_erlounge_sfbay2011.pdf" target="_blank">2011 ErLounge Meetup SF Bay Area (slides)</a>
</td></tr><tr><td>
Version 0.0.9a
</td><td>
<a href="docs/cloudi_ef_sfbay2010.pdf" target="_blank">2010 Erlang Factory SF Bay Area (slides)</a> <a href="docs/cloudi_ef_sfbay2010.txt" target="_blank">(demo text)</a>
</td></tr><tr><td>
Version 0.0.8a
</td><td>
<a href="https://vimeo.com/8192137" rel="noreferrer" target="_blank">2009 Erlang User Conference (video)</a> <a href="docs/cloudi_euc2009.pdf" target="_blank">(slides)</a>
</td></tr></table>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_Articles">2.7 - Articles</h3>
<table><tr><td>
<a href="https://www.toptal.com/erlang/a-cloud-at-the-lowest-level-built-in-erlang" rel="noreferrer" target="_blank">Bringing Erlang's Fault Tolerance to Polyglot Development</a>
</td><td>
@Toptal Engineering Blog
</td></tr><tr><td>
<a href="https://www.toptal.com/erlang/modernizing-legacy-software-an-example-using-erlang-and-cloudi" rel="noreferrer" target="_blank">Modernizing Legacy Software: A Case Study Using Erlang and CloudI</a> (<a href="https://github.com/okeuday/sillymud#readme" rel="noopener" target="_blank">integration source code</a>)
</td><td>
@Toptal Engineering Blog
</td></tr></table>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_ReportingBugs">2.8 - Reporting Bugs</h3>
<table><tr><td>
Bug Reports:
</td><td>
<a href="https://github.com/CloudI/CloudI/issues/new" rel="noopener" target="_blank">https://github.com/CloudI/CloudI/issues/new</a>
</td></tr><tr><td>
<a href="#2_MailingList">Mailing List:</a>
</td><td>
<a href="mailto:cloudi-questions@lists.sourceforge.net" target="_blank">cloudi-questions@lists.sourceforge.net</a> <a href="https://sourceforge.net/projects/cloudi/lists/cloudi-questions" rel="noopener" target="_blank">(Subscribe)</a>
</td></tr></table>
<p class="paragraph">
If you are unsure whether you have found a bug, please send an email to the
mailing list or utilize the <a href="https://webchat.oftc.net/?randomnick=1&channels=cloudi" rel="noreferrer" target="_blank">IRC chat room</a>.
Otherwise, you can easily enter a bug report for the problem by using the
<a href="https://github.com/CloudI/CloudI/issues/new" rel="noopener" target="_blank">online form</a>.
If you are unable to provide information about the problem publicly,
specify the information privately in an email to
<a href="mailto:mjtruog(at)protonmail;dot;com">Michael Truog</a>.
</p>
<div class="top"><a href="#2_contents">Top</a></div>
<h3 id="2_CodeOfConduct">2.9 - Code of Conduct</h3>
<p class="paragraph">
To ensure there are no barriers to CloudI development for any developers
who want to get involved, a Code of Conduct was adopted:
</p>
<h4>Contributor Covenant Code of Conduct</h4>
<h5>Our Pledge</h5>
<p>
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project
and our community a harassment-free experience for everyone, regardless of
age, body size, disability, ethnicity, gender identity and expression,
level of experience, nationality, personal appearance, race, religion,
or sexual identity and orientation.
</p>
<h5>Our Standards</h5>
<p>
Examples of behavior that contributes to creating a positive environment
include:
</p>
<ul>
<li>Using welcoming and inclusive language</li>
<li>Being respectful of differing viewpoints and experiences</li>
<li>Gracefully accepting constructive criticism</li>
<li>Focusing on what is best for the community</li>
<li>Showing empathy towards other community members</li>
</ul>
<p>
Examples of unacceptable behavior by participants include:
</p>
<ul>
<li>The use of sexualized language or imagery and unwelcome sexual attention or advances</li>
<li>Trolling, insulting/derogatory comments, and personal or political attacks</li>
<li>Public or private harassment</li>
<li>Publishing others' private information, such as a physical or electronic address, without explicit permission</li>
<li>Other conduct which could reasonably be considered inappropriate in a professional setting</li>
</ul>
<h5>Our Responsibilities</h5>
<p>
Project maintainers are responsible for clarifying the standards of
acceptable behavior and are expected to take appropriate and fair
corrective action in response to any instances of unacceptable behavior.
</p>