From 270c566fea00810c5bbaedb4aafd0dd8c57cf974 Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Wed, 22 Jul 2015 16:25:17 +0200 Subject: [PATCH] +doc #17613 document persistence schema evolution --- akka-docs/_sphinx/themes/akka/static/docs.css | 3 + akka-docs/rst/experimental/index.rst | 1 + .../images/persistence-detach-models.graffle | 596 +++++++++++++ .../rst/images/persistence-detach-models.png | Bin 0 -> 10786 bytes .../rst/images/persistence-detach-models.svg | 3 + .../persistence-drop-event-serializer.graffle | 786 ++++++++++++++++++ .../persistence-drop-event-serializer.png | Bin 0 -> 12911 bytes .../persistence-drop-event-serializer.svg | 3 + .../rst/images/persistence-drop-event.graffle | 596 +++++++++++++ .../rst/images/persistence-drop-event.png | Bin 0 -> 10469 bytes .../rst/images/persistence-drop-event.svg | 3 + .../persistence-event-adapter-1-n.graffle | 493 +++++++++++ .../images/persistence-event-adapter-1-n.png | Bin 0 -> 10235 bytes .../images/persistence-event-adapter-1-n.svg | 3 + .../images/persistence-manual-rename.graffle | 680 +++++++++++++++ .../rst/images/persistence-manual-rename.png | Bin 0 -> 13559 bytes .../persistence-serializer-rename.graffle | 679 +++++++++++++++ .../images/persistence-serializer-rename.png | Bin 0 -> 15688 bytes .../images/persistence-serializer-rename.svg | 3 + .../persistent-message-envelope.graffle | 542 ++++++++++++ .../images/persistent-message-envelope.png | Bin 0 -> 13393 bytes .../images/persistent-message-envelope.svg | 3 + .../persistence/LambdaPersistenceDocTest.java | 2 + akka-docs/rst/java/lambda-persistence.rst | 42 + akka-docs/rst/java/persistence.rst | 12 +- akka-docs/rst/java/serialization.rst | 4 +- .../PersistenceSchemaEvolutionDocSpec.scala | 407 +++++++++ akka-docs/rst/scala/index-actors.rst | 1 + .../scala/persistence-schema-evolution.rst | 476 +++++++++++ akka-docs/rst/scala/persistence.rst | 11 +- akka-docs/rst/scala/serialization.rst | 4 +- 31 files changed, 5334 insertions(+), 19 deletions(-) create mode 100644 akka-docs/rst/images/persistence-detach-models.graffle create mode 100644 akka-docs/rst/images/persistence-detach-models.png create mode 100644 akka-docs/rst/images/persistence-detach-models.svg create mode 100644 akka-docs/rst/images/persistence-drop-event-serializer.graffle create mode 100644 akka-docs/rst/images/persistence-drop-event-serializer.png create mode 100644 akka-docs/rst/images/persistence-drop-event-serializer.svg create mode 100644 akka-docs/rst/images/persistence-drop-event.graffle create mode 100644 akka-docs/rst/images/persistence-drop-event.png create mode 100644 akka-docs/rst/images/persistence-drop-event.svg create mode 100644 akka-docs/rst/images/persistence-event-adapter-1-n.graffle create mode 100644 akka-docs/rst/images/persistence-event-adapter-1-n.png create mode 100644 akka-docs/rst/images/persistence-event-adapter-1-n.svg create mode 100644 akka-docs/rst/images/persistence-manual-rename.graffle create mode 100644 akka-docs/rst/images/persistence-manual-rename.png create mode 100644 akka-docs/rst/images/persistence-serializer-rename.graffle create mode 100644 akka-docs/rst/images/persistence-serializer-rename.png create mode 100644 akka-docs/rst/images/persistence-serializer-rename.svg create mode 100644 akka-docs/rst/images/persistent-message-envelope.graffle create mode 100644 akka-docs/rst/images/persistent-message-envelope.png create mode 100644 akka-docs/rst/images/persistent-message-envelope.svg create mode 100644 akka-docs/rst/scala/code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala create mode 100644 akka-docs/rst/scala/persistence-schema-evolution.rst diff --git a/akka-docs/_sphinx/themes/akka/static/docs.css b/akka-docs/_sphinx/themes/akka/static/docs.css index cb29db7526..fbc53ad71b 100644 --- a/akka-docs/_sphinx/themes/akka/static/docs.css +++ b/akka-docs/_sphinx/themes/akka/static/docs.css @@ -178,3 +178,6 @@ strong {color: #0B5567; } .section-marker { position: absolute; width: 1em; margin-left: -1em; display: block; text-decoration: none; visibility: hidden; text-align: center; font-weight: normal; } .section-marker:hover { text-decoration: none; } .section h2:hover > a,.section h3:hover > a,.section h4:hover > a,.section h5:hover > a { visibility: visible; } + +div.align-center { width: 100%; text-align: center; } +p.caption { width: 80%; text-align: justify; font-size: 0.95em; font-style: italic; position: relative; left: 10%; } \ No newline at end of file diff --git a/akka-docs/rst/experimental/index.rst b/akka-docs/rst/experimental/index.rst index d94014b5af..8b2bae6a4e 100644 --- a/akka-docs/rst/experimental/index.rst +++ b/akka-docs/rst/experimental/index.rst @@ -20,6 +20,7 @@ prior deprecation. :maxdepth: 1 ../scala/persistence + ../scala/persistence-schema-evolution ../dev/multi-node-testing ../java/lambda-actors ../java/lambda-fsm diff --git a/akka-docs/rst/images/persistence-detach-models.graffle b/akka-docs/rst/images/persistence-detach-models.graffle new file mode 100644 index 0000000000..40c7f808e1 --- /dev/null +++ b/akka-docs/rst/images/persistence-detach-models.graffle @@ -0,0 +1,596 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGrafflePro + 139.18.0.187838 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.28997802734375, 782.8900146484375}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2015-07-23 08:51:08 +0000 + Creator + Konrad Malawski + DisplayScale + 1 0/72 in = 1.0000 in + ExportLineEnds + + + Gap + 0.5 + LineGap + 1 + Name + NonNavigable + Path + + elements + + + element + MOVETO + point + {0, 0} + + + element + LINETO + point + {14, 0} + + + element + MOVETO + point + {6, -4} + + + element + LINETO + point + {14, 4} + + + element + MOVETO + point + {14, -4} + + + element + LINETO + point + {6, 4} + + + + ShouldExport + YES + Width + 14 + + + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{145.63265806103379, 72.749998636153364}, {19, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 55 + Line + + ID + 54 + Position + 0.43243709206581116 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 E} + + Wrap + NO + + + Class + LineGraphic + ID + 54 + Points + + {187.09439086914062, 84.749998636153364} + {113.18368016802742, 84.749998636153364} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{280.05209427608111, 48.612242837540641}, {20, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 51 + Line + + ID + 50 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 O} + + Wrap + NO + + + Class + LineGraphic + ID + 50 + Points + + {329.8431396484375, 60.612242837540641} + {245.18111529837574, 60.612242837540641} + + Style + + stroke + + HeadArrow + NonNavigable + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{280.55209530438208, 70.749999613371074}, {19, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 49 + Line + + ID + 48 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 E} + + Wrap + NO + + + Class + LineGraphic + ID + 48 + Points + + {329.84314158862338, 82.749999613371074} + {245.18111529837574, 82.749999613371074} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{329.84315457120567, 27.964286256094354}, {54, 79.897956848144531}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Cylinder + Style + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs20 \cf0 Journal} + VerticalPad + 0 + + + + Bounds + {{187.09438968957969, 27.964285076097411}, {57.586738586425781, 79.897956848144531}} + Class + ShapedGraphic + ID + 13 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Event\ +Adapter} + + + + Bounds + {{9.9872450012231155, 51.61224533855227}, {102.19643402099609, 45.275508880615234}} + Class + ShapedGraphic + ID + 1 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 PersistentActor} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2015-07-24 08:44:48 +0000 + Modifier + Konrad Malawski + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.28997802734375, 841.8900146484375} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + FitInWindow + + Frame + {{288, -0}, {1920, 1417}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-268, 0}, {1096.1999781692175, 782.99998440658374}} + Zoom + 1.6283525228500366 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + + diff --git a/akka-docs/rst/images/persistence-detach-models.png b/akka-docs/rst/images/persistence-detach-models.png new file mode 100644 index 0000000000000000000000000000000000000000..721ddf0ba76936f52ddb0381798395bffff10e5a GIT binary patch literal 10786 zcmeAS@N?(olHy`uVBq!ia0y~yV4Tmuz);D-#=yYvtV3r%0|NtNage(c!@6@aFBupZ zI14-?iy0WWg+Z8+Vb&Z81_s8fnIRD+5xzcF$@#f@i7EL>sd^Q;1q>iyQ(;w+TacSt zlBiITo0C^;Rbi_HR$-M_Yy}e5S5g2gDap1~itr6kaLzAERWQ{v(KAr8<5EyiuqjGO zvkG!?gK95INwZbTC@Cqh($_C9FV`zK*2^zS*Eh7ZwA42+(l;{FElNq#Ew0QfNvzP# zD^`XW0yD=YwK%ybv!En1KTiQc*`C-7Np2%+x%nZbPVUWHG3E8-0++kpcn|%3#qT7dJaD8+~wmfa1oE zYr|usy9^BK&pcfmLn;{G&Sk$61iDlmRagR>yA%{$1$%mv zTx?xfrcO8^C=kf0#FeGcpeVp1A|SxwqF};(R-nt!q*34?(~Z>s-_8Hb@Bg{3djH+M z)$i|Cm*2NcFUz~FdH&3v^H<8lihO59tu<5rRgyM&{_XU(2E_yp38pp&B_?h4eH+E$ zd_N9}pHEoURAz%@8x$w>G)(k2GW&K+z<`B^(OE&ArKhHd>DnGs5buD1hueV@>XOpc z$xzk8Om23TjM?|3n7{_AC?`Cb+|#?)5Tg17C!_NGISr=yyo}BV1PoXv2^xIzJa+7! z1Vr_dmWGM`eg|f42kVt!I>{mNQzbb$p9iA4$mzfdb@ha^(O|tijVUZWHIp`OG>59T zRQ&L2&L7i!-bODafz15(;_pA$?Rob-@MvCGROZrs66&$vYZJs<6(@x3du7{i&;2=2 zaNYNwa?kT$_b-Z3p1)|qwgRtShlrW+RWDVK@16Je`~LsBrFWt`=dkdvTNfTz`E+0Q zpG%*^{%p;k?e6f@>p#b7sq=?^f4Kc&=fCLlyr0d^oc{6ogY3T}?_d9%`_x!@zRpFH z{aT$3T01=0rl%K`u07)D7i!EQ=Hb@%`ogDwq3f$c=QC(U324UMeX*)$qS?CA_1QZ= zy7ix$8I!p9|K~sP|9?%7&fR+T*Qeh6Ddnf$f0&njbIEru_y3n`udSQtf30Iy{ZtnR zm*(H||NlA8D`m1`(n}BFm(SU2gk#g}a^r`?T^Y zmOMW{JZR?M)h=Im!}i~g$9YG)ME~l%|NpVSen0e_joP%b~@y4?1qRP^I=)k+HOR)@PsDr+C(_Il(GEr||!`?fZ9H zzuR&6ZqaGock6b)E8@5PGC^JHMB$vY$=1E65wqJ|N z-gz}V{%*7f+o6eqijICy)Q^1qa@l|P)6>(dzt2pcS12A+&{+MTk^RnOf4i4vcT0l( zT^=9rFSmZTWAW{(*K7CIPvB2!>6|Qdev^ulvb=!l<5nCpQP2^oCWvnF4@tnW@NAqm^`hB~9y;^;@_WRxEtaeX~a&MV@Z!_O> z@Vn0eo8HEr4cY7WZu|ecO*(JJ3*Mi;{MjcbspcJQV$C}@$8z2hHJ=#|zTKe@W?fk^ z@8wT}Gn=2y%Kjy0s^Zc;D=uJK)3Tt}MMqC4%`lvz%JbCoY1eD*^?NRzoo9O+_gh=WK)EZzhmNk8 zILVCn+Go%1Ie*t{3pf;HSh%pT{QNRWaj!tH&LLN(tXNVd-6wuF zA6>pb>ek=&^78WCw%=|X7Ot69@aZ3avD5Fj+vjiRxp~p~cK!dqe<$3z=q~@Zogs5d zM}>y=j4}?5Sb6fd}lo=yPa!po`28Ayz*0ueDqntRq9jJIIn&7 zY@YRZxwb&SYF=?|rdL~8*_Vhf>|{8qJ1+$)G-w-@@of*{750yQA~>ZoPCw z*op1o29HNS9`}FWyKBRofb>gJuYWFaJ@@arD2K-huZE6>T}p+%YEAR_nOe6rx6eGr z(NR(mnx;??w#D|>i^X-0j>++>J|8u^o%1;S_|fO=Ge0vnn-tq$`@GWcU$jrLLqnG^ zm(bQ%MI5WP#C26DB;35@wk<_4xU#Wg#_Nl5n$rx+C(pDlU+2&FL^yvZ~N<@qKn zZr1POV-yU~=Zaq{8Q$cQcRjVFjgv`PhvmowX{X4;0nxczr$+B8$!uF#dTw=czwI^I z(kp>>OaeNYM}y*Sz0{TdS)%8!`-D$9!2duS(~iRzwRI{A0(P}_-Z`WcxUr#SCd&p6 z4{g=+Rw|>|nyeEuBZjzlxSaHh|`Ps)LelBr5 z`|oln$BIuL4_@tCEp#&}sl~Os{`JiBt^BF3ho^C*>a?j|3y&?Gy8GiX>Ayu!jn7#e zw*CEP^V9?BA0Hik=Ngx%fJ8R;%-@7D=%2pt{Po zpP@13B zd}rJ3yw}r%oekdjCr#El<(XP>E@1Wv_m}?8PTOwzu9yX`Fdeu#6bd$SB;1@(^W>_Z z_1h;KbPn%(v+497I|Z{sJ~^8kzH=-tMwjf)-T8FdznTB0Pyc-*x&P5-e$cFrxoXIc1lmWO+0zIvaV-P;A}|4mtV8t1t>tgRK~Z<_g9<@2oT zdyduqI4u8dTK>EJ|LfK_Js02qqt*KJ8RNgU_ZM81I=UcZvz%SckN+84-5ND+2|e+0 zZhe;gV(x;~zEW!oce=OBCpuMSoN0S=!T5W#{GS8u6Gh&Cuzb1r`C^mp&Q5N2ikr%E zK^42hWR8}m@as`;ul0y?)aztbq|A8o{04KC`UJM>ws(6z`_=!wzW?9W{6q0B&i>v~ zYh69&Jl}k;>h;%&*I&o~uR4B_ljpbKJd=3sGhs1;{T=2d(RW`bKe^2H>DyXxE5wjR zr6IXL_-@{YgKT`!Wy+g!)!%M=u;9(koR7w!mcs%Ujw77vb@y{ZdTVC6p4tZ%JRop_ zhf#U{nFS{O&<4URSB1}(^EYsd#hFVh{?@Z+nIVu<8f38l#*FiA4T={|bEG)gDM`kx znI?UT_x^XI8?H-j{S2&11RW{@H?$jWm4DJx zS={G-MhVo+vTb#Ue!?82_|d^GNMAAOm8OaJyof4G4K|hhl6M^EcN{kbCCWC3K#nD9 z@+{MISXe$TxaJrY+wIlRdRdC;O^@3B6qEOt&qcoZbUFsy{F&vdVER*l!O5rC=1YZw zoZl|v;5e2k_OpH;JUVImwcncg`y$WqH0C)kSX*nSG=IbO=1JDZPhA<#?lKYDFl#Y) zwbRqyO4FpaM;;zFdHi-i9-I;WaKV|sa_Zli)j4ufOsonMIDcl`;B8EM66~;Ut6@9OA?mUt;J!7S#J_Y-BtndjVphs!iBd3d_`yzTb+Y>(~#|2+RrH@~v` z_v!e5kIq;9Jfd#*(Ck)*^7hkuyDNN;{W#qiC;#__``wf3^WT8#^Y6#Z_g$3#)B5bO ze*MqWea@%)EFN`Kh`hNcpkd3j@?`rI#Vrc*I){8%LVksOFJQ@3xbT|u8a`Un8yMA^=~#FuTuJTCf)9_|GXzBl8xIOt_oyiA8c&P zzVdsa>e{8(LYWtZKRVrY#Nwldd^KzHp35f-Zh&fEeF?tzx6)?k%BY9MmESFW_xFAM ze*3GRn&tm2_N_g}7u#6YzK*{C>GvkP z|3A;~)(l>@BQ!kr>ip|Wm23C^`}OzGt7Egj?|om(mlT&eHMFL`_DF|dUcc?P0`<8i zlk6kbN?*S7HZyDWb7l*vO@fSyH_l8EXO!ZQ%2Pgn%FRY*+0jk!wfI#X`DFZMqB__& z|Nr-UxAwXnhvd1oB^+e>-pF5b;P1ch`@jD@AaG|x;^94eANN`RVNCkdF08v%q;Boj zYp-sKE{*?rD*O(&{+;Hbe{(JEP`!5Um83PlKJ=?Omc~|ZyMJ-hZ_pbT=pT5TpBGk{+{eJtr z{dV2I&+~V0-}iOxyRGYM*S^2G;br;FO{xEOB=_0WJ?d1y^RQk1-QpE{Bj$GGM;?9> z;@4N-c0#`9!$GG-I}08<9XGsgqG0iBmQ{+HEz`^i{Y~PWFYn#?q_}`fd3%mwO5Nir z!G0gzneSIT?w#rWe$#2a;>*kZzYG6qQH_lahxBMC+6 z_42u8MZe!{?w@U*ANMS9k@&)=&v?3P|2&reKKc7`nc^P#V<(jy!j@fJ%=vcT?{~MK zo9d>2dtvatInm?oo6YCT;{QAnzdJ2D@8#PoD}(Qr-Oj!KeSVdAe%i5U~dY||$@2z)h@H0K}UY>hpwI|CH?)V>0y0Zel zzZchy3X!&{D9{zs>Ae3rH|%96#{x0kiR)a~zKptJ{mMhKZ`#4@?{+?)7iFR{W5%-| z-5HFYxz_ZuQ7=2Ww@pr66gVqy-_NxB%!#atw!(sudylW2zj5LB6UzN>%*8$b zCjOW_&+7N)9cGthnA$>$EpCQeDj#6cYkK$R^ZEDOncv>rtb3u`S@X-zr|@7^&X9=y% zxl?vKSGKrHXMOs{j+xH{3_fM@ssGkWXNkx-u;XW+^}8G5LQg*QmG3#6zh%jx^u!lm zFC228&G6Ya=a$QY#ET{g%l2?=@L=v{>wLTY{=M37o9CD2Y|%Zn=kMG6a!|h~UiaiG zPbq^8o{LG7${sNmI%eps)<0CRPCT{l$A^cmEaB!n%JX+^xN%rXZ~>Ehacf_#{=%6C ziB0R@OpmXtynkxLhuT@$(~R@?d_1=AI-@Ihk<+g{m zW-Q4k&g+O<89X^7w|#x>+w4}A$-KL_->=*K`_zVOyU)z-*L-GNJgv1Xp=|MePzU8uX6fM+v5zmr8@ukT+4t*} z-Ts^Rg{7i)_}hLBNjuVfUs;)#De~RyOtb!r0R>kA-CIv)zuXmm+Ra;`^yKj#rVW4Q zS*nB>B-Z`9Jbzb)Ve|g9t;^aLMH>E``@ZJ5Y{>=3yk}=-#<4%Ru`&7Y9mQ0(;)|~0 zm2(@e=>O5{erfTOfkn$XVpqqm`fG2LPn@@WKF7ykQT4gJ7mYq*w;Jnz9G3qz%|*g* zwY1vi4tI%tvCsP*R#(n3a|<)Oq!hmP|3%^D-a5B}OBb!BeNkB9BCTUxH~Pgjy;?R#;^$=X26=T#=V z+vE@Dtlz&eS29|7;)h1twb$kQf5#r5$6J;0=6b@34hw;JqiJGYK9|}&cfE0!uiX;9 zxXEj(<-|=Vt3EC`FhNelf77hApP!!I%Z{>&xb*+(`nu4AGjB7pO!{OIRsQPx+a5{d zW3LsGAFtqXYT{isWnuZ=*Ri#Sd$->y>VE&#f414#>9)@#;-znsaEtfD^u-WV5-S>6dySE+q5%+Iuc-+gU!n15E zmMK19wAFo(`tpSOt>+JRcQ&+pUix-AMY5RjO@#XdIQCfP^pZP4GO!$A1kLTis%$_`5Z%av`D~<^q0wx^t1qT@GM6b;)zxVR$0SBfD zClcFbp9x6JXf*SgS9na4kN2pE3CHW;`M;*bXNqQNs_C5Ib&B0pvQpZrWQBgjkFx>% ztbMANYm%24bMQ<#ZlbZsRxt0{n#g%I8ncZASa=mqsiwZZJpbR8{N7EM`r3GS4LUd; zty+GtYJpK!sth*?+w;0O12XyTCnc)h2n+Jg=hUZBq4U;#D-jk!xxPHyZT*f zSi0ujhQoZVx)}jAY(?H1A26KV62Y@T@sD)o@1>~@>zPBv-xQ_gbKDIoDck5g@144K zu+!T^A!nA)ue;TLn6Kzqh@yDd3=eCA!|8KoAF8V3d1agtdV%@y2Bq#ej<%0s9{nG~ zo~;hxIw{A=qnqT>RmnZY{St55e1?aL9WQ!wx7|#;=hQXBK(56*(UFyhZE4pUpFsVd zyKkkKzscY5e+c%t-i+Nf=d15Mek}T}Lz7!WYUvpT2@Pi+>*N#39PLHU-c#djs@)H5 zy11ez>gI=lY5&+Ok8F@kZEQ2*jR-3@@?k4fxL@~mb^K2@o>>=O8YX9KG0T>?oA_Sh z6Z1@tol}oaS@hglHPwTsdqVn-PQ7&H-2Fas&NdQNGFz0?{pP&*o~Q62@`!+xmg&FC zuToa@P4zEyPFyfm;q9RbGOUg&%iih!cdoc{dF|2fXIM8>_U9S9Ea#p4r+=YH$eYsw z`G+`p3l|%lQmEnZ=Q8|w-RHSL#+2hchucmci`=R1>^-fG+cta}cRSnNd;$KpKg$f+ zEL)caN^adGxG3~qw$w%wo8$fR@1HNtT%i!Jp{+63b-#Ry%i$ln`PH+h_wV3YY`Qyx zZNG-TkEp?Pmzg}(59hip7qOKuyV339WT2oBRm+j2rPQ{xuP5`Ewn}W^jk%TrRgOG~ zxqH7}`+IHU<+V#)xlV3mVp;hA#p3=p$Er)oGV@N_Nk++7884mblfNZ#($(@ck0vb) z6^@_iey}?v;)SsN6*jgnr_PkfHM&*$*cp~+^|GF^HL^KWVSSw8!sX=?j}~x0jaR#4 z?BqYM(yq!`YTiTZS4SOEL+WNm=dn!CoWfnD9QDt?=i;qKo5d5Ac6OXDDy}+_xY%ln z;2cI(X3s>!DY8#^kGTC@e6UBp=S0b+DT|&@W^vHIRVP`uxV>?e;IrS;4_nEr_9Xzi$t$z$R*BsV`a}G_0;g^ar2&?laJpz?DDuX z&g6aOi54l@4&BwZOP9_p|1v>w?S`Bsx{H4+F*2m!*5TZH?#8*;a{>s{y%CK zWT&*bZV z$c3~sF@ZL66L=?|(-BW!r}d`Sw5xybd45JIo!(C~*jS6F^DN%@$+x(C%683*TwbRP zQd=L2ewzE1?F_48N5+l|PO5Wu7C-;ha^$qzETdWSO3yYcUa(@)=hrj;xPJxH*$%te zEB#l>tnpl)+TO5iwugVSCFichL8)QY)1;YucyvCrWrl z#8O*D=bT88^80d5*Js}z z1qI=%4`)qTta=?*KCiLj?Q6~F5b0#tby#AZaWcmjCZ?$`etvOsi;&`FJi(rQOyC78 z%bMqxxp(Gdnt%s2QaB`jPSJ7Ju{xK%!r{FnH`5sjCZAWvH_xVdKMUQMvt;jwL)^S` zxReu~1V21;TKmpt41D>6(bY zzpn3p7n*Q(w)y(Wftxnmb~tciIq!#EFV}NOnr&V5t<`tOieC=;As5?fb#<<~f9>F$ zw&-HLs!iFw;(r3GKirTmf4z45FW*b+YcB58mQs7OFeyGZuzh{0-qyR)n{+K++}o3@ zm6~zJ?Zo`*cRSD}n|sw8lSz-BEcV^y`Ty*1%jHt)Z$F;0ezWRF{*&OTb52>zd$Ynlm49znRr*Ea zZF)yrBH4I18ngtTUvP{=m)Xj1w#5Z)ZzcJVBbR@jJzcQOPfp^A=>4)ksTIA>(t!_K z6x<&>@9>__dq-y3iJ76Ph8Y}*nN=%Rx)e5_IP~LnWmujvFT0yf??kgtnLUBwb%vFn zQtYSoAB%3gW3fv{$>~9IMBtIYeLg1Qi7U>miTm|!`~JJzch6TgwaDnd7qB-`zGICn zqx0%Yg|Ak7oot@y|5)_9;MbRzakH(C-&nj$UYA!(*mX*C*dd4ga#j3iLxdTX=Vv{O zR@<2NQ;SJ#>2#jh1=~3v?oT->q(8-&bBU*a#G3|&Ckb|vRi<-fPTR1YGCM2M%&^2R z^OB0ajJJP>(ZLBBwxt0_kGyyqkkR5XU4>Vz>eTl8b=4CCH*7F+IS{rxl_PEHUMI%~ zQ#@`P-8v+>KCQ#GSl@LCx8tEzt1dY7t=YFZG+$BcXzb?oZO0Di*Z=fBJ}2PPhx9TqDgBvGYnK$sSG`!+x=i`yjjqf7_Ioc>L?nC_ zOt_rCoTppimSo)9kUhG08U;P>eqI>bHBl<}?rB+zi0a#(EK|~tH2#_NHf4@Zj`IP5 z7rHD#ll^UH2xPh0eVw3r-dM0-(692-k)$M!FG`^Py$8GbzI*$`9d(Omos|Eisj|@M z`1MC=91=`-I~{Hp+hsX+SGd?+W7bMkasV)lKJ1>g;bg*z? z3U}(|jbG#E^i!ToEAZyQPabAQo0d2Il`*TFkzd#pb7S-2V-8{L8`Ik#&$=miu6PYc z$BYPP#ruB@?(Y_F-0&_%al-0`ki91D=V$pkM?X>CAea)-BKzcU9q$P@7iPoGnj1IL zpIpxQw&ma4PcBcK;~X3!!gwdz?+H$BtU0_y(`N1QbN>=KO5~aLhLmse$cm2k`C0#ZZ5ZoKIWj~X?CyN-`=j{($GslK1dc6j4jL^#)xY!PC%@bET5tQ^ zvfDpj=lyv2qRTM(*blbVQfrrJ_c>~3=FYC^@bIt`;1+x|v+cf%&8x2xKetSBU0cij zErP?9MVU#-KILoQpX}ufTg9w@-x7GC#}aaXg?q#+saaMQnWY~e9nI_3-L|5p>0+II z@-d$BQ<}?vn0W2maytWLas$iUD$`xdSF1frT*vi@}@es@W2$N{}$|n;+eX_g@3mm61Hwd>b_nrMrOgHL@ z=(#=#!$am7u3IJ<@5uDY`ZRIFAyp$I7Z;}fFb3ybfqpTm2eVG{Gd|`1xnNH~U4W&6 zTuhbSFSq|E^~0`yyt!e8U))s1WviU8XkOKSb>qgyZbUQ4VC zudE16?I=rc-}`rJ1QhtEh-;~Y@NxNOOillJWYL{{lgfC0B$Vi1w|}#6{sx^d zT5M}m%q2WIRy(#gT)Xh?m~{S|sT+&5bY|U5KRfHGS?3qEqP$B-I)(4qy>6G?oInEDj!t-Ltxs&cOHSCS1P<+*m=MG{hME+ zEC)3GY;-noEthd~W53NSYjvep-u~YFD^=Gb({~E{Ssa`{`G|n5`z!_PUSX54ZDwS2_GM_DhimGxwAThl3LouiIQM<26kQO}}(x zyY44N2d4HAl?Mtk2ZH_E^ABY!D+rvt-_okIM{Rz}p={gNuHio(bj_*eWakvp=0E$~ zD#G)f;`&SP7N&%8`EUtV0Svufh~;cxqO%53ZMb@%%Yy*xDM33uc| zR~exPJgPA|vyZC&DJ=Cp-@5qx#y87V{)lRa{g~Wk$;G_8=4a9Nl9xf>?-ZZksp#BR z;iR~30^jOS9lNVcZNz_OG+XJNuW+~8pk;n`@wNY_x1D5vzha9K!&;w<#>z5^7bU}g zDsMO5sFA+n5KE%cqlG-lU)IerJg*lf)OV<%dSV&C)VN1j$Lc3-MCOyK`0`cPBn(uq>3$(%orF!zby`BD3)dbc@?Rcphk zWi0Ep9)ZSYqdQl0ItlFg@u<6Yt(R8KRjCjT4wfF4?x-ys_APxa6AKu`6ECmav(jnD z1Gh?s=u<3Ba)-AXu*bJpI>#x=XVx@^C@B4TAXR?1^!isl73KXO{8Rnb-Fw*fb7{?G z!6 z2+zXIFLzEX7j*iz@3r6pqo9i`ZiJYH76|g&DzdPI9a@mJz$3!rfrFWnLhR(SOFd7k zl@~rMl3e4$!;#4&QPdln&lD6G`ADir@a7At>7UwpPqN!{IzKFsH&)$I(U0@%n)D-HCm`J zslZWVlHH{dm}^IO#G@mJ>nn~I$96Y7=|465 zl>GUxI%m{lC$~rRtm~A2KlQlHb1N0`*yFK35C0c!`@W}FUU|ORfzA8Fn*&-Z3N{Lbg!&{)KH@o-puv3aPP6&b4kI-ouJ?zt z_X++iSX=$GbM^BW?fk>pM;ptJFq-eVW;~UBAOHN9(SM#)zSzG11_?zHWW~ z*S#_Oc-QX?zjti?&hR*GJJ0XG^z-f=JE5N6a`wNMf++_ewbNG3n>?YSb-l}@ zCXY#el9yJB>77^Eqq5-3+?_WS6k?tRO`9UG6~1tFw$pQ~J@OiEr`&57f7lUT@o@8p zsQ;RWOh0KdrE)J8;%J!~CK{_7rs{CMG~U!)#KiM@sCRJaV{3tby{97o)V>I}wUOGp z{`>qr^Cf>i>D}-%-jn6fDXF+{BSW#5rxY)&IAdBB-^#N868n0m9Nj+X@~_y&hKc^+ zDT`GPfmW(DW+^5-310hW(+%)Sv-WfmS2QA$6boFyt=akR{0FERxyZ`_I literal 0 HcmV?d00001 diff --git a/akka-docs/rst/images/persistence-detach-models.svg b/akka-docs/rst/images/persistence-detach-models.svg new file mode 100644 index 0000000000..b579a437d5 --- /dev/null +++ b/akka-docs/rst/images/persistence-detach-models.svg @@ -0,0 +1,3 @@ + + +2015-07-23 12:27ZCanvas 1Layer 1PersistentActorEventAdapterJournalADDA diff --git a/akka-docs/rst/images/persistence-drop-event-serializer.graffle b/akka-docs/rst/images/persistence-drop-event-serializer.graffle new file mode 100644 index 0000000000..73ee045051 --- /dev/null +++ b/akka-docs/rst/images/persistence-drop-event-serializer.graffle @@ -0,0 +1,786 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGrafflePro + 139.18.0.187838 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.28997802734375, 782.8900146484375}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2015-07-23 08:51:08 +0000 + Creator + Konrad Malawski + DisplayScale + 1 0/72 in = 1.0000 in + ExportLineEnds + + + Gap + 0.5 + LineGap + 1 + Name + NonNavigable + Path + + elements + + + element + MOVETO + point + {0, 0} + + + element + LINETO + point + {14, 0} + + + element + MOVETO + point + {6, -4} + + + element + LINETO + point + {14, 4} + + + element + MOVETO + point + {14, -4} + + + element + LINETO + point + {6, 4} + + + + ShouldExport + YES + Width + 14 + + + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{263.4039515357976, 48.112230402415705}, {18, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 61 + Line + + ID + 60 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 T} + + Wrap + NO + + + Class + LineGraphic + ID + 60 + Points + + {296.98822404239763, 60.112230402415705} + {244.68112182617185, 60.112230402415705} + + Style + + stroke + + HeadArrow + NonNavigable + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{262.90395153579766, 70.874989110500337}, {19, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 59 + Line + + ID + 58 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 E} + + Wrap + NO + + + Class + LineGraphic + ID + 58 + Points + + {296.98822404239769, 82.874989110500337} + {244.68112182617188, 82.874989110500337} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{296.34996616998893, 27.964282227528443}, {63.018733978271484, 79.897956848144531}} + Class + ShapedGraphic + ID + 57 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Serializer} + + + + Bounds + {{145.63265806103379, 72.749998636153364}, {19, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 55 + Line + + ID + 54 + Position + 0.43243709206581116 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 E} + + Wrap + NO + + + Class + LineGraphic + ID + 54 + Points + + {187.09439086914062, 84.749998636153364} + {113.18368016802742, 84.749998636153364} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{394.23969235661161, 48.612232334669955}, {20, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 51 + Line + + ID + 50 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 O} + + Wrap + NO + + + Class + LineGraphic + ID + 50 + Points + + {444.03073772896801, 60.612232334669955} + {359.36871337890625, 60.612232334669955} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{394.73969338491258, 70.74998911050038}, {19, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 49 + Line + + ID + 48 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 E} + + Wrap + NO + + + Class + LineGraphic + ID + 48 + Points + + {444.03073966915389, 82.74998911050038} + {359.36871337890625, 82.74998911050038} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{444.03075265173618, 27.964275753223664}, {54, 79.897956848144531}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Cylinder + Style + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs20 \cf0 Journal} + VerticalPad + 0 + + + + Bounds + {{187.09438968957969, 27.964285076097411}, {57.586738586425781, 79.897956848144531}} + Class + ShapedGraphic + ID + 13 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Event\ +Adapter} + + + + Bounds + {{9.9872450012231155, 51.61224533855227}, {102.19643402099609, 45.275508880615234}} + Class + ShapedGraphic + ID + 1 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 PersistentActor} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2015-07-24 11:04:44 +0000 + Modifier + Konrad Malawski + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.28997802734375, 841.8900146484375} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + FitInWindow + + Frame + {{271, 0}, {1920, 1417}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-268, 0}, {1096.199978169217, 782.99998440658374}} + Zoom + 1.6283525228500366 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + + diff --git a/akka-docs/rst/images/persistence-drop-event-serializer.png b/akka-docs/rst/images/persistence-drop-event-serializer.png new file mode 100644 index 0000000000000000000000000000000000000000..fbffc89f233aa41f3885a7768a9646342e188ae2 GIT binary patch literal 12911 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 + +2015-07-24 11:04ZCanvas 1Layer 1PersistentActorEventAdapterJournalEOESerializerET diff --git a/akka-docs/rst/images/persistence-drop-event.graffle b/akka-docs/rst/images/persistence-drop-event.graffle new file mode 100644 index 0000000000..84f0697818 --- /dev/null +++ b/akka-docs/rst/images/persistence-drop-event.graffle @@ -0,0 +1,596 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGrafflePro + 139.18.0.187838 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.28997802734375, 782.8900146484375}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2015-07-23 08:51:08 +0000 + Creator + Konrad Malawski + DisplayScale + 1 0/72 in = 1.0000 in + ExportLineEnds + + + Gap + 0.5 + LineGap + 1 + Name + NonNavigable + Path + + elements + + + element + MOVETO + point + {0, 0} + + + element + LINETO + point + {14, 0} + + + element + MOVETO + point + {6, -4} + + + element + LINETO + point + {14, 4} + + + element + MOVETO + point + {14, -4} + + + element + LINETO + point + {6, 4} + + + + ShouldExport + YES + Width + 14 + + + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{145.63265806103379, 72.749998636153364}, {19, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 55 + Line + + ID + 54 + Position + 0.43243709206581116 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 E} + + Wrap + NO + + + Class + LineGraphic + ID + 54 + Points + + {187.09439086914062, 84.749998636153364} + {113.18368016802742, 84.749998636153364} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{280.05209427608111, 48.612242837540641}, {20, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 51 + Line + + ID + 50 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 O} + + Wrap + NO + + + Class + LineGraphic + ID + 50 + Points + + {329.8431396484375, 60.612242837540641} + {245.18111529837574, 60.612242837540641} + + Style + + stroke + + HeadArrow + NonNavigable + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{280.55209530438208, 70.749999613371074}, {19, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 49 + Line + + ID + 48 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 E} + + Wrap + NO + + + Class + LineGraphic + ID + 48 + Points + + {329.84314158862338, 82.749999613371074} + {245.18111529837574, 82.749999613371074} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{329.84315457120567, 27.964286256094354}, {54, 79.897956848144531}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Cylinder + Style + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs20 \cf0 Journal} + VerticalPad + 0 + + + + Bounds + {{187.09438968957969, 27.964285076097411}, {57.586738586425781, 79.897956848144531}} + Class + ShapedGraphic + ID + 13 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Event\ +Adapter} + + + + Bounds + {{9.9872450012231155, 51.61224533855227}, {102.19643402099609, 45.275508880615234}} + Class + ShapedGraphic + ID + 1 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 PersistentActor} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2015-07-24 10:59:39 +0000 + Modifier + Konrad Malawski + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.28997802734375, 841.8900146484375} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + FitInWindow + + Frame + {{323, 0}, {1920, 1417}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-268, 0}, {1096.199978169217, 782.99998440658374}} + Zoom + 1.6283525228500366 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + + diff --git a/akka-docs/rst/images/persistence-drop-event.png b/akka-docs/rst/images/persistence-drop-event.png new file mode 100644 index 0000000000000000000000000000000000000000..3f040fa1613a0d41bcda45aef53ac496c140bc12 GIT binary patch literal 10469 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 + +2015-07-24 08:44ZCanvas 1Layer 1PersistentActorEventAdapterJournalEOE diff --git a/akka-docs/rst/images/persistence-event-adapter-1-n.graffle b/akka-docs/rst/images/persistence-event-adapter-1-n.graffle new file mode 100644 index 0000000000..90e4ce719c --- /dev/null +++ b/akka-docs/rst/images/persistence-event-adapter-1-n.graffle @@ -0,0 +1,493 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGrafflePro + 139.18.0.187838 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.28997802734375, 782.8900146484375}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2015-07-23 08:51:08 +0000 + Creator + Konrad Malawski + DisplayScale + 1 0/72 in = 1.0000 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{329.84315457120567, 27.964286256094354}, {54, 79.897956848144531}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Cylinder + Style + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs20 \cf0 Journal} + VerticalPad + 0 + + + + Bounds + {{144.29847089815703, 62.227041518775934}, {17, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 46 + Line + + ID + 43 + Offset + -3.9948978424072266 + Position + 0.46160221099853516 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 n} + + Wrap + NO + + + Bounds + {{281.55210828696437, 55.91326468016662}, {17, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 45 + Line + + ID + 39 + Position + 0.46999874711036682 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 1} + + Wrap + NO + + + Class + LineGraphic + ID + 44 + Points + + {187.23724704207191, 79.232143676368707} + {113.32653634095871, 79.232143676368707} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Class + LineGraphic + ID + 43 + Points + + {186.91581837426398, 70.232143676368707} + {113.00510767315077, 70.232143676368707} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Class + LineGraphic + Head + + ID + 13 + + ID + 39 + Points + + {329.84315457120567, 67.91326468016662} + {245.18112828095803, 67.91326468016662} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 10 + Info + 4 + + + + Bounds + {{187.09438968957969, 27.964285076097411}, {57.586738586425781, 79.897956848144531}} + Class + ShapedGraphic + ID + 13 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Event\ +Adapter} + + + + Bounds + {{9.9872450012231155, 51.61224533855227}, {102.19643402099609, 45.275508880615234}} + Class + ShapedGraphic + ID + 1 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 PersistentActor} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2015-07-23 12:19:58 +0000 + Modifier + Konrad Malawski + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.28997802734375, 841.8900146484375} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + FitInWindow + + Frame + {{288, 79}, {1404, 1318}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-142, 0}, {844.92092710347549, 783.00000809589221}} + Zoom + 1.5019156932830811 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + + diff --git a/akka-docs/rst/images/persistence-event-adapter-1-n.png b/akka-docs/rst/images/persistence-event-adapter-1-n.png new file mode 100644 index 0000000000000000000000000000000000000000..40536832c182f0fb251d94f0a83f33b3bcfddc21 GIT binary patch literal 10235 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 + +2015-07-23 12:19ZCanvas 1Layer 1PersistentActorEventAdapter1nJournal diff --git a/akka-docs/rst/images/persistence-manual-rename.graffle b/akka-docs/rst/images/persistence-manual-rename.graffle new file mode 100644 index 0000000000..58f6b31afd --- /dev/null +++ b/akka-docs/rst/images/persistence-manual-rename.graffle @@ -0,0 +1,680 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle.MacAppStore + 139.18 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.28997802734375, 782.8900146484375}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2015-07-23 08:51:08 +0000 + Creator + Konrad Malawski + DisplayScale + 1 0/72 in = 1.0000 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{156.34123947922424, 144.36435961675622}, {30, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 69 + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 [v2]} + + Wrap + NO + + + Bounds + {{140.17231558676406, 124.47240374005878}, {57, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 68 + Line + + ID + 67 + Position + 0.43243709206581116 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.seatNr} + + Wrap + NO + + + Class + LineGraphic + ID + 67 + Points + + {208.32634070768711, 136.35918075415361} + {116.62739570856519, 136.62100608778607} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{283.60994305394411, 125.36436946675957}, {57, 38}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 66 + Line + + ID + 65 + Offset + 2.7059365947934566e-07 + Position + 0.46274498105049133 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.seatNr\ +[v2]} + + Wrap + NO + + + Class + LineGraphic + ID + 65 + Points + + {351.286868282196, 144.36436973735323} + {266.6248419919483, 144.36436973735323} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{139.9605523938219, 107.01448443883029}, {57, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 55 + Line + + ID + 54 + Position + 0.43243709206581116 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.seatNr} + + Wrap + NO + + + Class + LineGraphic + ID + 54 + Points + + {208.11457852770752, 119.3142831598844} + {116.41563118613487, 118.62100608778607} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{287.89817853151374, 80.152605485515707}, {48, 38}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 60 + Line + + ID + 59 + Offset + -2.7059365947934566e-07 + Position + 0.46274498105049133 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.code\ +[v1]} + + Wrap + NO + + + Class + LineGraphic + ID + 59 + Points + + {351.07510375976562, 99.152605214922048} + {266.41307746951793, 99.152605214922048} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{351.07510558931313, 79.835293707727061}, {54, 79.897956848144531}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Cylinder + Style + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs20 \cf0 Journal} + VerticalPad + 0 + + + + Bounds + {{208.32634070768711, 79.835292527730118}, {57.586738586425781, 79.897956848144531}} + Class + ShapedGraphic + ID + 61 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs22 \cf0 Serializer} + + + + Bounds + {{13.219196019330578, 103.48325279018498}, {102.19643402099609, 45.275508880615234}} + Class + ShapedGraphic + ID + 1 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 PersistentActor} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2015-08-13 10:04:11 +0000 + Modifier + Konrad Malawski + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.28997802734375, 841.8900146484375} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + FitInWindow + + Frame + {{4, 0}, {1436, 877}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-413, 0}, {1385.9632356340144, 782.9999832367414}} + Zoom + 0.93869733810424805 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + + diff --git a/akka-docs/rst/images/persistence-manual-rename.png b/akka-docs/rst/images/persistence-manual-rename.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea4f46c42229248326f98503c83713482613c45 GIT binary patch literal 13559 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 + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle.MacAppStore + 139.18 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.28997802734375, 782.8900146484375}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2015-07-23 08:51:08 +0000 + Creator + Konrad Malawski + DisplayScale + 1 0/72 in = 1.0000 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{140.17231558676406, 124.47240374005878}, {57, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 68 + Line + + ID + 67 + Position + 0.43243709206581116 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.seatNr} + + Wrap + NO + + + Class + LineGraphic + ID + 67 + Points + + {208.32634070768711, 136.35918075415361} + {116.62739570856519, 136.62100608778607} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{283.60994305394411, 123.36436973735323}, {57, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 66 + Line + + ID + 65 + Position + 0.46274498105049133 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.seatNr} + + Wrap + NO + + + Class + LineGraphic + ID + 65 + Points + + {351.286868282196, 135.36436973735323} + {266.6248419919483, 135.36436973735323} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Class + LineGraphic + Head + + ID + 61 + + ID + 63 + Points + + {237.119717968369, 50.243527827595514} + {237.119717968369, 79.335292523504918} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + FilledArrow + + + Tail + + ID + 56 + + + + Bounds + {{183.40465009683402, 20.265881949346891}, {107.43011379637244, 29.477645874023438}} + Class + ShapedGraphic + ID + 56 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Protocol\ +IDL} + + + + Bounds + {{139.9605523938219, 107.01448443883029}, {57, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 55 + Line + + ID + 54 + Position + 0.43243709206581116 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.seatNr} + + Wrap + NO + + + Class + LineGraphic + ID + 54 + Points + + {208.11457852770752, 119.3142831598844} + {116.41563118613487, 118.62100608778607} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{287.89817853151374, 96.152605214922048}, {48, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Color + + w + 0 + + Font + Helvetica + Size + 12 + + ID + 60 + Line + + ID + 59 + Position + 0.46274498105049133 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 A.code} + + Wrap + NO + + + Class + LineGraphic + ID + 59 + Points + + {351.07510375976562, 108.15260521492205} + {266.41307746951793, 108.15260521492205} + + Style + + stroke + + HeadArrow + FilledArrow + Legacy + + LineType + 1 + TailArrow + 0 + + + + + Bounds + {{351.07510558931313, 79.835293707727061}, {54, 79.897956848144531}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Cylinder + Style + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs20 \cf0 Journal} + VerticalPad + 0 + + + + Bounds + {{208.32634070768711, 79.835292527730118}, {57.586738586425781, 79.897956848144531}} + Class + ShapedGraphic + ID + 61 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs22 \cf0 Serializer} + + + + Bounds + {{13.219196019330578, 103.48325279018498}, {102.19643402099609, 45.275508880615234}} + Class + ShapedGraphic + ID + 1 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 PersistentActor} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2015-08-13 10:00:21 +0000 + Modifier + Konrad Malawski + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.28997802734375, 841.8900146484375} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + FitInWindow + + Frame + {{4, 0}, {1436, 877}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-413, 0}, {1385.9632356340144, 782.9999832367414}} + Zoom + 0.93869733810424805 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + + diff --git a/akka-docs/rst/images/persistence-serializer-rename.png b/akka-docs/rst/images/persistence-serializer-rename.png new file mode 100644 index 0000000000000000000000000000000000000000..94d8183a90aabdcbdbc73f54b87c4f3ee428cb9d GIT binary patch literal 15688 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 j!*8}d3T@9aa{Q4GjXzek_eR@g(Dr6eS3j3^P6 + +2015-07-28 09:05ZCanvas 1Layer 1PersistentActorSerializerJournalA.aA.a1ProtocolIDLA.a1A.a1 diff --git a/akka-docs/rst/images/persistent-message-envelope.graffle b/akka-docs/rst/images/persistent-message-envelope.graffle new file mode 100644 index 0000000000..71ae11948d --- /dev/null +++ b/akka-docs/rst/images/persistent-message-envelope.graffle @@ -0,0 +1,542 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGrafflePro + 139.18.0.187838 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.28997802734375, 782.8900146484375}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2015-07-23 08:51:08 +0000 + Creator + Konrad Malawski + DisplayScale + 1 0/72 in = 1 0/72 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{42.612243483896464, 209.73214502568541}, {208.72704538616881, 16.645408630371094}} + Class + ShapedGraphic + ID + 77 + Shape + Rectangle + Style + + fill + + Color + + b + 0.211198 + g + 0.79545 + r + 1 + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 payload} + + + + Bounds + {{122.5076543485809, 187.0943887622513}, {128.83163452148438, 16.645408630371094}} + Class + ShapedGraphic + ID + 74 + Shape + Rectangle + Style + + fill + + Color + + b + 1 + g + 0.990725 + r + 0.795885 + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 payloadManifest} + + + + Bounds + {{42.612245338551958, 187.09438968957969}, {73.86474609375, 16.645408630371094}} + Class + ShapedGraphic + ID + 70 + Shape + Rectangle + Style + + fill + + Color + + b + 1 + g + 0.990725 + r + 0.795885 + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 serializerId} + + + + Bounds + {{34.880753086927484, 166.78699333426209}, {222.86349779925854, 65.582908630371094}} + Class + ShapedGraphic + ID + 76 + Shape + Rectangle + Style + + fill + + Color + + b + 1 + g + 0.992157 + r + 0.796078 + + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs24 \cf0 PersistentPayload\ +\ +\ +} + + + + Bounds + {{113.45474415668954, 146.81250404707274}, {144.28950500488281, 16.645408630371094}} + Class + ShapedGraphic + ID + 73 + Shape + Rectangle + Style + + fill + + Color + + b + 1 + g + 0.990725 + r + 0.795885 + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 ...} + + + + Bounds + {{34.880752054212735, 146.81250682905579}, {73.86474609375, 16.645408630371094}} + Class + ShapedGraphic + ID + 71 + Shape + Rectangle + Style + + fill + + Color + + b + 1 + g + 0.990725 + r + 0.795885 + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 manifest} + + + + Bounds + {{113.45474588130318, 126.83801404462653}, {144.28950500488281, 16.645408630371094}} + Class + ShapedGraphic + ID + 72 + Shape + Rectangle + Style + + fill + + Color + + b + 1 + g + 0.990725 + r + 0.795885 + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 persistenceId} + + + + Bounds + {{34.880753908867661, 126.83801682660956}, {73.86474609375, 16.645408630371094}} + Class + ShapedGraphic + ID + 69 + Shape + Rectangle + Style + + fill + + Color + + b + 1 + g + 0.992157 + r + 0.796078 + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 seqNr} + + + + Bounds + {{27.303571669521091, 106.53061334638005}, {241.34693908691406, 131.16581726074219}} + Class + ShapedGraphic + ID + 75 + Shape + Rectangle + Style + + fill + + Color + + b + 0.920143 + g + 0.851771 + r + 0.237451 + + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs24 \cf0 PersistentMessage\ +\ +\ +\ +\ +\ +\ +\ +} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2015-07-23 12:16:09 +0000 + Modifier + Konrad Malawski + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.28997802734375, 841.8900146484375} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + FitInWindow + + Frame + {{268, 99}, {1776, 1318}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-266, 0}, {1092.6046031338085, 783.0000080958921}} + Zoom + 1.5019156932830811 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + + diff --git a/akka-docs/rst/images/persistent-message-envelope.png b/akka-docs/rst/images/persistent-message-envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..4b44036e63a9033b6234bea6958f962034602eb6 GIT binary patch literal 13393 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 JtaD0e0s!FXbN2uM literal 0 HcmV?d00001 diff --git a/akka-docs/rst/images/persistent-message-envelope.svg b/akka-docs/rst/images/persistent-message-envelope.svg new file mode 100644 index 0000000000..45d87252bc --- /dev/null +++ b/akka-docs/rst/images/persistent-message-envelope.svg @@ -0,0 +1,3 @@ + + +2015-07-23 09:54ZCanvas 1Layer 1PersistentMessageseqNrpersistenceIdmanifest...PersistentPayloadserializerIdpayloadManifestpayload diff --git a/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java b/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java index 48e746c22a..48a0629c42 100644 --- a/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java +++ b/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java @@ -8,6 +8,8 @@ import akka.japi.Procedure; import akka.japi.pf.ReceiveBuilder; import akka.pattern.BackoffSupervisor; import akka.persistence.*; +import akka.persistence.journal.EventAdapter; +import akka.persistence.journal.EventSeq; import scala.Option; import scala.concurrent.duration.Duration; import scala.PartialFunction; diff --git a/akka-docs/rst/java/lambda-persistence.rst b/akka-docs/rst/java/lambda-persistence.rst index 60c09fc16f..cfb3623ef7 100644 --- a/akka-docs/rst/java/lambda-persistence.rst +++ b/akka-docs/rst/java/lambda-persistence.rst @@ -586,6 +586,46 @@ not accept more messages and it will throw ``AtLeastOnceDelivery.MaxUnconfirmedM The default value can be configured with the ``akka.persistence.at-least-once-delivery.max-unconfirmed-messages`` configuration key. The method can be overridden by implementation classes to return non-default values. +.. _event-adapters-lambda: + +Event Adapters +============== + +In long running projects using event sourcing sometimes the need arises to detach the data model from the domain model +completely. + +Event Adapters help in situations where: + +- **Version Migrations** – existing events stored in *Version 1* should be "upcasted" to a new *Version 2* representation, + and the process of doing so involves actual code, not just changes on the serialization layer. For these scenarios + the ``toJournal`` function is usually an identity function, however the ``fromJournal`` is implemented as + ``v1.Event=>v2.Event``, performing the neccessary mapping inside the fromJournal method. + This technique is sometimes refered to as "upcasting" in other CQRS libraries. +- **Separating Domain and Data models** – thanks to EventAdapters it is possible to completely separate the domain model + from the model used to persist data in the Journals. For example one may want to use case classes in the + domain model, however persist their protocol-buffer (or any other binary serialization format) counter-parts to the Journal. + A simple ``toJournal:MyModel=>MyDataModel`` and ``fromJournal:MyDataModel=>MyModel`` adapter can be used to implement this feature. +- **Journal Specialized Data Types** – exposing data types understood by the underlying Journal, for example for data stores which + understand JSON it is possible to write an EventAdapter ``toJournal:Any=>JSON`` such that the Journal can *directly* store the + json instead of serializing the object to its binary representation. + +Implementing an EventAdapter is rather stright forward: + +.. includecode:: code/docs/persistence/PersistenceEventAdapterDocTest.java#identity-event-adapter + +Then in order for it to be used on events coming to and from the journal you must bind it using the below configuration syntax: + +.. includecode:: ../scala/code/docs/persistence/PersistenceEventAdapterDocSpec.scala#event-adapters-config + +It is possible to bind multiple adapters to one class *for recovery*, in which case the ``fromJournal`` methods of all +bound adapters will be applied to a given matching event (in order of definition in the configuration). Since each adapter may +return from ``0`` to ``n`` adapted events (called as ``EventSeq``), each adapter can investigate the event and if it should +indeed adapt it return the adapted event(s) for it, other adapters which do not have anything to contribute during this +adaptation simply return ``EventSeq.empty``. The adapted events are then delivered in-order to the ``PersistentActor`` during replay. + +.. note:: + For more advanced schema evolution techniques refer to the :ref:`persistence-schema-evolution-scala` documentation. + .. _persistent-fsm-java-lambda: Persistent FSM @@ -794,6 +834,8 @@ it must add to the application configuration. If not specified, a default serializer is used. +For more advanced schema evolution techniques refer to the :ref:`persistence-schema-evolution-scala` documentation. + Testing ======= diff --git a/akka-docs/rst/java/persistence.rst b/akka-docs/rst/java/persistence.rst index bdbe0f58b7..5c2acd8d9b 100644 --- a/akka-docs/rst/java/persistence.rst +++ b/akka-docs/rst/java/persistence.rst @@ -601,10 +601,6 @@ configuration key. The method can be overridden by implementation classes to ret Event Adapters ============== -.. note:: - - Complete documentation featuring use-cases and implementation examples for this feature will follow shortly. - In long running projects using event sourcing sometimes the need arises to detach the data model from the domain model completely. @@ -638,11 +634,7 @@ indeed adapt it return the adapted event(s) for it, other adapters which do not adaptation simply return ``EventSeq.empty``. The adapted events are then delivered in-order to the ``PersistentActor`` during replay. .. note:: - More advanced techniques utilising advanced binary serialization formats such as protocol buffers or kryo / thrift / avro - will be documented very soon. These schema evolutions often may need to reach into the serialization layer, however - are much more powerful in terms of flexibly removing unused/deprecated classes from your classpath etc. - - + For more advanced schema evolution techniques refer to the :ref:`persistence-schema-evolution-scala` documentation. Storage plugins =============== @@ -833,6 +825,8 @@ it must add to the application configuration. If not specified, a default serializer is used. +For more advanced schema evolution techniques refer to the :ref:`persistence-schema-evolution-scala` documentation. + Testing ======= diff --git a/akka-docs/rst/java/serialization.rst b/akka-docs/rst/java/serialization.rst index 7b60c5ee86..8f1a2188c3 100644 --- a/akka-docs/rst/java/serialization.rst +++ b/akka-docs/rst/java/serialization.rst @@ -111,11 +111,13 @@ bytes to different objects. Then you only need to fill in the blanks, bind it to a name in your :ref:`configuration` and then list which classes that should be serialized using it. +.. _string-manifest-serializer-java: + Serializer with String Manifest ------------------------------- The ``Serializer`` illustrated above supports a class based manifest (type hint). -For serialization of data that need to evolve over time the `SerializerWithStringManifest` +For serialization of data that need to evolve over time the ``SerializerWithStringManifest`` is recommended instead of ``Serializer`` because the manifest (type hint) is a ``String`` instead of a ``Class``. That means that the class can be moved/removed and the serializer can still deserialize old data by matching on the ``String``. This is especially useful diff --git a/akka-docs/rst/scala/code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala b/akka-docs/rst/scala/code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala new file mode 100644 index 0000000000..6aa3ff66ac --- /dev/null +++ b/akka-docs/rst/scala/code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala @@ -0,0 +1,407 @@ +/* + * Copyright (C) 2009-2015 Typesafe Inc. + */ + +package docs.persistence + +import scala.language.reflectiveCalls +import java.nio.charset.Charset + +import akka.actor.ActorSystem +import akka.persistence.journal.{ EventAdapter, EventSeq } +import akka.serialization.{ SerializationExtension, SerializerWithStringManifest } +import akka.testkit.TestKit +import com.typesafe.config._ +import org.scalatest.WordSpec +import spray.json.JsObject + +import scala.concurrent.duration._ + +class PersistenceSchemaEvolutionDocSpec extends WordSpec { + + val customSerializerConfig = + """ + //#custom-serializer-config + akka.actor { + serializers { + my-payload = "docs.persistence.MyPayloadSerializer" + my-snapshot = "docs.persistence.MySnapshotSerializer" + } + serialization-bindings { + "docs.persistence.MyPayload" = my-payload + "docs.persistence.MySnapshot" = my-snapshot + } + } + //#custom-serializer-config + """ + + val system = ActorSystem("PersistenceSchemaEvolutionDocSpec", ConfigFactory.parseString(customSerializerConfig)) + try { + SerializationExtension(system) + } finally { + TestKit.shutdownActorSystem(system, 10.seconds, false) + } + +} + +class ProtobufReadOptional { + object proto { + class SeatReserved { + def hasSeatType = false + def getLetter = "" + def getRow = 1 + def getSeatType = "" + } + object SeatReserved { + def newBuilder = new { + def setCode(any: Any): this.type = this + def setRow(any: Any): this.type = this + def setSeatType(any: Any): this.type = this + def build() = new { + def toByteArray: Array[Byte] = Array() + } + } + def parseFrom(any: Any) = new SeatReserved + } + } + + //#protobuf-read-optional-model + sealed abstract class SeatType { def code: String } + object SeatType { + def fromString(s: String) = s match { + case Window.code => Window + case Aisle.code => Aisle + case Other.code => Other + case _ => Unknown + } + case object Window extends SeatType { override val code = "W" } + case object Aisle extends SeatType { override val code = "A" } + case object Other extends SeatType { override val code = "O" } + case object Unknown extends SeatType { override val code = "" } + + } + + case class SeatReserved(letter: String, row: Int, seatType: SeatType) + //#protobuf-read-optional-model + + val protoIDL = """ + //#protobuf-read-optional-proto + // FlightAppModels.proto + option java_package = "docs.persistence.proto"; + option optimize_for = SPEED; + + message SeatReserved { + required string letter = 1; + required string row = 2; + optional string seatType = 3; // the new field + } + //#protobuf-read-optional-proto + """ + + //#protobuf-read-optional + /** + * Example serializer impl which uses protocol buffers generated classes (proto.*) + * to perform the to/from binary marshalling. + */ + class AddedFieldsSerializerWithProtobuf extends SerializerWithStringManifest { + override def identifier = 67876 + + final val SeatReservedManifest = classOf[SeatReserved].getName + + override def manifest(o: AnyRef): String = o.getClass.getName + + override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = + manifest match { + case SeatReservedManifest => + seatReserved(proto.SeatReserved.parseFrom(bytes)) // use generated protobuf serializer + case _ => + throw new IllegalArgumentException("Unable to handle manifest: " + manifest) + } + + override def toBinary(o: AnyRef): Array[Byte] = o match { + case s: SeatReserved => + proto.SeatReserved.newBuilder + .setCode(s.letter) + .setSeatType(s.seatType) + .build().toByteArray + } + + // -- fromBinary helpers -- + + private def seatReserved(p: proto.SeatReserved): SeatReserved = + SeatReserved(p.getLetter, p.getRow, seatType(p)) + + // handle missing field by assigning "Unknown" value + private def seatType(p: proto.SeatReserved): SeatType = + if (p.hasSeatType) SeatType.fromString(p.getSeatType) else SeatType.Unknown + + } + //#protobuf-read-optional +} + +class ProtoBufRename { + val protoIDL = """ + //#protobuf-rename-proto + // protobuf message definition, BEFORE: + message SeatReserved { + required string code = 1; + } + + // protobuf message definition, AFTER: + message SeatReserved { + required string seatNr = 1; // field renamed, id remains the same + } + //#protobuf-rename-proto + """ +} + +class RenamePlainJson { + //#rename-plain-json + class JsonRenamedFieldAdapter extends EventAdapter { + val marshaller = new ExampleJsonMarshaller + + val V1 = "v1" + val V2 = "v2" + + // this could be done independently for each event type + override def manifest(event: Any): String = "v2" + + override def toJournal(event: Any): JsObject = + marshaller.toJson(event) + + override def fromJournal(event: Any, manifest: String): EventSeq = event match { + case json: JsObject => EventSeq(marshaller.fromJson(manifest match { + case V1 => rename(json, "code" -> "seatNr") + case V2 => json // pass-through + case unknown => throw new IllegalArgumentException(s"Unknown manifest: $unknown") + })) + case _ => + val c = event.getClass + throw new IllegalArgumentException("Can only work with JSON, was: %s".format(c)) + } + + def rename(json: JsObject, fromTo: (String, String)): JsObject = { + val value = json.fields(fromTo._1) + val withoutOld = json.fields - fromTo._1 + JsObject(withoutOld + (fromTo._2 -> value)) + } + + } + //#rename-plain-json +} + +class SimplestCustomSerializer { + + //#simplest-custom-serializer-model + final case class Person(name: String, surname: String) + //#simplest-custom-serializer-model + + //#simplest-custom-serializer + /** + * Simplest possible serializer, uses a string representation of the Person class. + * + * Usually a serializer like this would use a library like: + * protobuf, kryo, avro, cap'n proto, flatbuffers, SBE or some other dedicated serializer backend + * to perform the actual to/from bytes marshalling. + */ + class SimplestPossiblePersonSerializer extends SerializerWithStringManifest { + val Utf8 = Charset.forName("UTF-8") + + val PersonManifest = classOf[Person].getName + + // unique identifier of the serializer + def identifier = 1234567 + + // extract manifest to be stored together with serialized object + override def manifest(o: AnyRef): String = o.getClass.getName + + // serialize the object + def toBinary(obj: AnyRef): Array[Byte] = obj match { + case p: Person => s"""${p.name}|${p.surname}""".getBytes(Utf8) + case _ => throw new IllegalArgumentException( + s"Unable to serialize to bytes, clazz was: ${obj.getClass}!") + } + + // deserialize the object, using the manifest to indicate which logic to apply + def fromBinary(bytes: Array[Byte], clazz: String): AnyRef = clazz match { + case PersonManifest => + val nameAndSurname = new String(bytes, Utf8) + val Array(name, surname) = nameAndSurname.split("[|]") + Person(name, surname) + case _ => throw new IllegalArgumentException( + s"Unable to deserialize from bytes, clazz was: $clazz! Bytes length: ${bytes.length}") + } + + } + + //#simplest-custom-serializer +} + +class PersonSerializerSettingsBox { + val PersonSerializerSettings = """ + //#simplest-custom-serializer-config + # application.conf + akka { + actor { + serializers { + person = "docs.persistence.SimplestPossiblePersonSerializer" + } + + serialization-bindings { + "docs.persistence.Person" = person + } + } + } + //#simplest-custom-serializer-config + """ +} + +final case class SamplePayload(p: Any) + +//#split-events-during-recovery +trait V1 +trait V2 + +// V1 event: +final case class UserDetailsChanged(name: String, address: String) extends V1 + +// corresponding V2 events: +final case class UserNameChanged(name: String) extends V2 +final case class UserAddressChanged(address: String) extends V2 + +// event splitting adapter: +class UserEventsAdapter extends EventAdapter { + override def manifest(event: Any): String = "" + + override def fromJournal(event: Any, manifest: String): EventSeq = event match { + case UserDetailsChanged(null, address) => EventSeq(UserAddressChanged(address)) + case UserDetailsChanged(name, null) => EventSeq(UserNameChanged(name)) + case UserDetailsChanged(name, address) => EventSeq(UserNameChanged(name), + UserAddressChanged(address)) + case event: V2 => EventSeq(event) + } + + override def toJournal(event: Any): Any = event +} +//#split-events-during-recovery + +final case class CustomerBlinked(customerId: Long) + +//#string-serializer-skip-deleved-event-by-manifest +case object EventDeserializationSkipped + +class RemovedEventsAwareSerializer extends SerializerWithStringManifest { + val Utf8 = Charset.forName("UTF-8") + override def identifier: Int = 8337 + + val SkipEventManifestsEvents = Set( + "docs.persistence.CustomerBlinked" // ... + ) + val MyPayloadClassName = classOf[SamplePayload].getName + + override def manifest(o: AnyRef): String = o.getClass.getName + + override def toBinary(o: AnyRef): Array[Byte] = o match { + case _ => o.toString.getBytes(Utf8) // example serialization + } + + override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = manifest match { + case m if SkipEventManifestsEvents.contains(m) => + EventDeserializationSkipped + + case other => new String(bytes) + } +} +//#string-serializer-skip-deleved-event-by-manifest + +//#string-serializer-skip-deleved-event-by-manifest-adapter +class SkippedEventsAwareAdapter extends EventAdapter { + override def manifest(event: Any) = "" + override def toJournal(event: Any) = event + + override def fromJournal(event: Any, manifest: String) = event match { + case EventDeserializationSkipped => EventSeq.empty + case _ => EventSeq(event) + } +} +//#string-serializer-skip-deleved-event-by-manifest-adapter + +//#string-serializer-handle-rename +class RenamedEventAwareSerializer extends SerializerWithStringManifest { + val Utf8 = Charset.forName("UTF-8") + override def identifier: Int = 8337 + + val OldPayloadClassName = "docs.persistence.OldPayload" // class NOT available anymore + val MyPayloadClassName = classOf[SamplePayload].getName + + override def manifest(o: AnyRef): String = o.getClass.getName + + override def toBinary(o: AnyRef): Array[Byte] = o match { + case SamplePayload(data) => s"""$data""".getBytes(Utf8) + // previously also handled "old" events here. + } + + override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = manifest match { + case OldPayloadClassName => SamplePayload(new String(bytes, Utf8)) + case MyPayloadClassName => SamplePayload(new String(bytes, Utf8)) + case other => throw new Exception(s"unexpected manifest [$other]") + } +} +//#string-serializer-handle-rename + +//#detach-models +/** Domain model - highly optimised for domain language and maybe "fluent" usage */ +object DomainModel { + final case class Customer(name: String) + final case class Seat(code: String) { + def bookFor(customer: Customer): SeatBooked = SeatBooked(code, customer) + } + + final case class SeatBooked(code: String, customer: Customer) +} + +/** Data model - highly optimised for schema evolution and persistence */ +object DataModel { + final case class SeatBooked(code: String, customerName: String) +} +//#detach-models + +//#detach-models-adapter +class DetachedModelsAdapter extends EventAdapter { + override def manifest(event: Any): String = "" + + override def toJournal(event: Any): Any = event match { + case DomainModel.SeatBooked(code, customer) => + DataModel.SeatBooked(code, customer.name) + } + override def fromJournal(event: Any, manifest: String): EventSeq = event match { + case DataModel.SeatBooked(code, customerName) => + EventSeq(DomainModel.SeatBooked(code, DomainModel.Customer(customerName))) + } +} +//#detach-models-adapter + +// act as-if JSON library +class ExampleJsonMarshaller { + def toJson(any: Any): JsObject = JsObject() + def fromJson(json: JsObject): Any = new Object +} + +//#detach-models-adapter-json +class JsonDataModelAdapter extends EventAdapter { + override def manifest(event: Any): String = "" + + val marshaller = new ExampleJsonMarshaller + + override def toJournal(event: Any): JsObject = + marshaller.toJson(event) + + override def fromJournal(event: Any, manifest: String): EventSeq = event match { + case json: JsObject => + EventSeq(marshaller.fromJson(json)) + case _ => + throw new IllegalArgumentException( + "Unable to fromJournal a non-JSON object! Was: " + event.getClass) + } +} +//#detach-models-adapter-json diff --git a/akka-docs/rst/scala/index-actors.rst b/akka-docs/rst/scala/index-actors.rst index ca09504ab7..31babc0126 100644 --- a/akka-docs/rst/scala/index-actors.rst +++ b/akka-docs/rst/scala/index-actors.rst @@ -12,6 +12,7 @@ Actors routing fsm persistence + persistence-schema-evolution persistence-query testing actordsl diff --git a/akka-docs/rst/scala/persistence-schema-evolution.rst b/akka-docs/rst/scala/persistence-schema-evolution.rst new file mode 100644 index 0000000000..b390da3b87 --- /dev/null +++ b/akka-docs/rst/scala/persistence-schema-evolution.rst @@ -0,0 +1,476 @@ +.. _persistence-schema-evolution-scala: + +############################## +Persistence - Schema Evolution +############################## + +When working on long running projects using :ref:`persistence-scala`, or any kind of `Event Sourcing`_ architectures, +schema evolution becomes one of the more important technical aspects of developing your application. +The requirements as well as our own understanding of the business domain may (and will) change in time. + +In fact, if a project matures to the point where you need to evolve its schema to adapt to changing business +requirements you can view this as first signs of its success – if you wouldn't need to adapt anything over an apps +lifecycle that could mean that no-one is really using it actively. + +In this chapter we will investigate various schema evolution strategies and techniques from which you can pick and +choose the ones that match your domain and challenge at hand. + +.. note:: + This page proposes a number of possible solutions to the schema evolution problem and explains how some of the + utilities Akka provides can be used to achieve this, it is by no means a complete (closed) set of solutions. + + Sometimes, based on the capabilities of your serialization formats, you may be able to evolve your schema in + different ways than outlined in the sections below. If you discover useful patterns or techniques for schema + evolution feel free to submit Pull Requests to this page to extend it. + + +Schema evolution in event-sourced systems +========================================= + +In recent years we have observed a tremendous move towards immutable append-only datastores, with event-sourcing being +the prime technique successfully being used in these settings. For an excellent overview why and how immutable data makes scalability +and systems design much simpler you may want to read Pat Helland's excellent `Immutability Changes Everything`_ whitepaper. + +Since with `Event Sourcing`_ the **events are immutable** and usually never deleted – the way schema evolution is handled +differs from how one would go about it in a mutable database setting (e.g. in typical CRUD database applications). +The system needs to be able to continue to work in the presence of "old" events which were stored under the "old" schema. +We also want to limit complexity in the business logic layer, exposing a consistent view over all of the events of a given +type to :class:`PersistentActor` s and :ref:`persistence queries `. This allows the business logic layer to focus on solving business problems +instead of having to explicitly deal with different schemas. + +The system needs to be able to continue to work in the presence of "old" events which were stored under the "old" schema, +and we want to limit the complexity to the data layer, exposing a consistent view over all of the events of a given type +to :class:`PersistentActor` s and persistence queries, which allows these layers to focus on the business problems instead +handling the different schemas explicitly in the business logic layers. + + +In summary, schema evolution in event sourced systems exposes the following characteristics: + - Allow the system to continue operating without large scale migrations to be applied, + - Allow the system to read "old" events from the underlying storage, however present them in a "new" view to the application logic, + - Transparently promote events to the latest versions during recovery (or queries) such that the business logic need not consider multiple versions of events + +.. _Immutability Changes Everything: http://www.cidrdb.org/cidr2015/Papers/CIDR15_Paper16.pdf +.. _Event Sourcing: http://martinfowler.com/eaaDev/EventSourcing.html + +Types of schema evolution +------------------------- +Before we explain the various techniques that can be used to safely evolve the schema of your persistent events +over time, we first need to define what the actual problem is, and what the typical styles of changes are. + +Since events are never deleted, we need to have a way to be able to replay (read) old events, in such way +that does not force the ``PersistentActor`` to be aware of all possible versions of an event that it may have +persisted in the past. Instead, we want the Actors to work on some form of "latest" version of the event and provide some +means of either converting old "versions" of stored events into this "latest" event type, or constantly evolve the event +definition - in a backwards compatible way - such that the new deserialization code can still read old events. + +The most common schema changes you will likely are: + +- :ref:`adding a field to an event type `, +- :ref:`remove or rename field in event type `, +- :ref:`remove event type `, +- :ref:`split event into multiple smaller events `. + +The following sections will explain some patterns which can be used to safely evolve your schema when facing those changes. + +Picking the right serialization format +====================================== + +Picking the serialization format is a very important decision you will have to make while building your application. +It affects which kind of evolutions are simple (or hard) to do, how much work is required to add a new datatype, and, +last but not least, serialization performanceion. + +If you find yourself realising you have picked "the wrong" serialization format, it is always possible to change +the format used for storing new events, however you would have to keep the old deserialization code in order to +be able to replay events that were persisted using the old serialization scheme. It is possible to "rebuild" +an event-log from one serialization format to another one, however it may be a more involved process if you need +to perform this on a live system. + +Binary serialization formats that we have seen work well for long-lived applications include the very flexible IDL based: +`Google Protobuf`_, `Apache Thrift`_ or `Apache Avro`_. Avro schema evolution is more "entire schema" based, instead of +single fields focused like in protobuf or thrift, and usually requires using some kind of schema registry. + +Users who want their data to be human-readable directly in the write-side +datastore may opt to use plain-old `JSON`_ as the storage format, though that comes at a cost of lacking support for schema +evolution and relatively large marshalling latency. + +There are plenty excellent blog posts explaining the various trade-offs between popular serialization formats, +one post we would like to highlight is the very well illustrated `Schema evolution in Avro, Protocol Buffers and Thrift`_ +by Martin Kleppmann. + +.. _Google Protobuf: https://developers.google.com/protocol-buffers +.. _Apache Avro: https://avro.apache.org +.. _JSON: http://json.org +.. _Schema evolution in Avro, Protocol Buffers and Thrift: http://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html + +Provided default serializers +---------------------------- + +Akka Persistence provides `Google Protocol Buffers`_ based serializers (using :ref:`Akka Serialization `) +for it's own message types such as ``PersistentRepr``, ``AtomicWrite`` and snapshots. Journal plugin implementations +*may* choose to use those provided serializers, or pick a serializer which suits the underlying database better. + +.. note:: + Serialization is **NOT** handled automatically by Akka Persistence itself. Instead, it only provides the above described + serializers, and in case a ``AsyncWriteJournal`` plugin implementation chooses to use them directly, the above serialization + scheme will be used. + + Please refer to your write journal's documentation to learn more about how it handles serialization! + + For example, some journals may choose to not use Akka Serialization *at all* and instead store the data in a format + that is more "native" for the underlying datastore, e.g. using JSON or some other kind of format that the target + datastore understands directly. + +The below figure explains how the default serialization scheme works, and how it fits together with serializing the +user provided message itself, which we will from here on refer to as the ``payload`` (highlighted in yellow): + +.. figure:: ../images/persistent-message-envelope.png + :align: center + + Akka Persistence provided serializers wrap the user payload in an envelope containing all persistence-relevant information. + **If the Journal uses provided Protobuf serializers for the wrapper types (e.g. PersistentRepr), then the payload will + be serialized using the user configured serializer, and if none is provided explicitly, Java serialization will be used for it.** + +The blue colored regions of the ``PersistentMessage`` indicate what is serialized using the generated protocol buffers +serializers, and the yellow payload indicates the user provided event (by calling ``persist(payload)(...)``). +As you can see, the ``PersistentMessage`` acts as an envelope around the payload, adding various fields related to the +origin of the event (``persistenceId``, ``sequenceNr`` and more). + +More advanced techniques (e.g. :ref:`remove-event-class-scala`) will dive into using the manifests for increasing the +flexibility of the persisted vs. exposed types even more. Hhowever for now we will focus on the simpler evolution techniques, +concerning simply configuring the payload serializers. + +By default the ``payload`` will be serialized using Java Serialization. This is fine for testing and initial phases +of your development (while you're still figuring out things and the data will not need to stay persisted forever). +However, once you move to production you should really *pick a different serializer for your payloads*. + +.. warning:: + Do not rely on Java serialization (which will be picked by Akka by default if you don't specify any serializers) + for *serious* application development! It does not lean itself well to evolving schemas over long periods of time, + and its performance is also not very high (it never was designed for high-throughput scenarios). + +.. _Google Protocol Buffers: https://developers.google.com/protocol-buffers/ +.. _Apache Thrift: https://thrift.apache.org/ + +Configuring payload serializers +------------------------------- +This section aims to highlight the complete basics on how to define custom serializers using :ref:`Akka Serialization `. +Many journal plugin implementations use Akka Serialization, thus it is tremendously important to understand how to configure +it to work with your event classes. + +.. note:: + Read the :ref:`Akka Serialization ` docs to learn more about defining custom serializers, + to improve performance and maintainability of your system. Do not depend on Java serialization for production deployments. + +The below snippet explains in the minimal amount of lines how a custom serializer can be registered. +For more in-depth explanations on how serialization picks the serializer to use etc, please refer to its documentation. + +First we start by defining our domain model class, here representing a person: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#simplest-custom-serializer-model + +Next we implement a serializer (or extend an existing one to be able to handle the new ``Person`` class): + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#simplest-custom-serializer + +And finally we register the serializer and bind it to handle the ``docs.persistence.Person`` class: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#simplest-custom-serializer-config + +Deserialization will be performed by the same serializer which serialized the message initially +because of the ``identifier`` being stored together with the message. + +Please refer to the :ref:`Akka Serialization ` documentation for more advanced use of serializers, +especially the :ref:`string-manifest-serializer-scala` section since it is very useful for Persistence based applications +dealing with schema evolutions, as we will see in some of the examples below. + +Schema evolution in action +========================== + +In this section we will discuss various schema evolution techniques using concrete examples and explaining +some of the various options one might go about handling the described situation. The list below is by no means +a complete guide, so feel free to adapt these techniques depending on your serializer's capabilities +and/or other domain specific limitations. + +.. _add-field-scala: + +Add fields +---------- + +**Situation:** +You need to add a field to an existing message type. For example, a ``SeatReservation(letter:String, row:Int)`` now +needs to have an associated code which indicates if it is a window or aisle seat. + +**Solution:** +Adding fields is the most common change you'll need to apply to your messages so make sure the serialization format +you picked for your payloads can handle it apropriately, i.e. such changes should be *binary compatible*. +This is easily achieved using the right serializer toolkit – we recommend something like `Google Protocol Buffers`_ or +`Apache Thrift`_ however other tools may fit your needs just as well – picking a serializer backend is something +you should research before picking one to run with. In the following examples we will be using protobuf, mostly because +we are familiar with it, it does its job well and Akka is using it internally as well. + +While being able to read messages with missing fields is half of the solution, you also need to deal with the missing +values somehow. This is usually modeled as some kind of default value, or by representing the field as an ``Option[T]`` +See below for an example how reading an optional field from from a serialized protocol buffers message might look like. + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#protobuf-read-optional-model + +Next we prepare an protocol definition using the protobuf Interface Description Language, which we'll use to generate +the serializer code to be used on the Akka Serialization layer (notice that the schema aproach allows us to easily rename +fields, as long as the numeric identifiers of the fields do not change): + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#protobuf-read-optional-proto + +The serializer implementation uses the protobuf generated classes to marshall the payloads. +Optional fields can be handled explicitly or missing values by calling the ``has...`` methods on the protobuf object, +which we do for ``seatType`` in order to use a ``Unknown`` type in case the event was stored before we had introduced +the field to this event type: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#protobuf-read-optional + +.. _rename-field-scala: + +Rename fields +------------- + +**Situation:** +When first designing the system the ``SeatReverved`` event featured an ``code`` field. +After some time you discover that what what was originally called ``code`` actually means ``seatNr``, thus the model +should be changed to reflect this concept more accurately. + + +**Solution 1 - using IDL based serializers:** +First, we will discuss the most efficient way of dealing with such kinds of schema changes – IDL based serializers. + +IDL stands for Interface Description Language, and means that the schema of the messages that will be stored is based +on this description. Most IDL based serializers also generate the serializer / deserializer code so that using them +is not too hard. Examples of such serializers are protobuf or thrift. + +Using these libraries rename operations are "free", because the field name is never actually stored in the binary +representation of the message. This is one of the advantages of schema based serializers, even though that they +add the overhead of having to maintain the schema. When using serializers like this, no additional code change +(except renaming the field and method used during serialization) is needed to perform such evolution: + +.. figure:: ../images/persistence-serializer-rename.png + :align: center + +This is how such a rename would look in protobuf: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#protobuf-rename-proto + +It is important to learn about the strengths and limitations of your serializers, in order to be able to move +swiftly and refactor your models fearlessly as you go on with the project. + +.. note:: + Learn in-depth about the serialization engine you're using as it will impact how you can aproach schema evolution. + + Some operations are "free" in certain serialization formats (more often than not: removing/adding optional fields, + sometimes renaming fields etc.), while some other operations are strictly not possible. + +**Solution 2 - by manually handling the event versions:** +Another solution, in case your serialization format does not support renames as easily as the above mentioned formats, +is versioning your schema. For example, you could have made your events events carry an additional field called ``_version`` +which was set to ``1`` (because it was the initial schema), and once you change the schema you bump this number to ``2``, +and write an adapter which can perform the rename. + +This approach is popular when your serialization format is something like JSON, where renames can not be performed +automatically by the serializer. You can do these kinds of "promotions" either manually (as shown in the example below) +or using a library like `Stamina`_ which helps to create those ``V1->V2->V3->...->Vn`` promotion chains without much boilerplate. + +.. figure:: ../images/persistence-manual-rename.png + :align: center + +The following snippet showcases how one could apply renames if working with plain JSON (using ``spray.json.JsObject``): + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#rename-plain-json + +As you can see, manually handling renames induces some boilerplate onto the EventAdapter, however much of it +you will find is common infrastructure code that can be either provided by an external library (for promotion management) +or put together in a simple helper trait. + +.. note:: + The technique of versioning events and then promoting them to the latest version using JSON transformations + can of course be applied to more than just field renames – it also applies to adding fields and all kinds of + changes in the message format. + +.. _Stamina: https://github.com/scalapenos/stamina + +.. _remove-event-class-scala: + +Remove event class and ignore events +------------------------------------ + +**Situation:** +While investigating app performance you notice that insane amounts of ``CustomerBlinked`` events are being stored +for every customer each time he/she blinks. Upon investigation you decide that the event does not add any value +and should be deleted. You still have to be able to replay from a journal which contains those old CustomerBlinked events though. + +**Naive solution - drop events in EventAdapter:** + +The problem of removing an event type from the domain model is not as much its removal, as the implications +for the recovery mechanisms that this entails. For example, a naive way of filtering out certain kinds of events from +being delivered to a recovering ``PersistentActor`` is pretty simple, as one can simply filter them out in an :ref:`EventAdapter `: + + +.. figure:: ../images/persistence-drop-event.png + :align: center + + The ``EventAdapter`` can drop old events (**O**) by emitting an empty :class:`EventSeq`. + Other events can simply be passed through (**E**). + +This however does not address the underlying cost of having to deserialize all the events during recovery, +even those which will be filtered out by the adapter. In the next section we will improve the above explained mechanism +to avoid deserializing events which would be filtered out by the adapter anyway, thus allowing to save precious time +during a recovery containing lots of such events (without actually having to delete them). + +**Improved solution - deserialize into tombstone:** + +In the just described technique we have saved the PersistentActor from receiving un-wanted events by filtering them +out in the ``EventAdapter``, however the event itself still was deserialized and loaded into memory. +This has two notable *downsides*: + + - first, that the deserialization was actually performed, so we spent some of out time budget on the + deserialization, even though the event does not contribute anything to the persistent actors state. + - second, that we are *unable to remove the event class* from the system – since the serializer still needs to create + the actuall instance of it, as it does not know it will not be used. + +The solution to these problems is to use a serializer that is aware of that event being no longer needed, and can notice +this before starting to deserialize the object. + +This aproach allows us to *remove the original class from our classpath*, which makes for less "old" classes lying around in the project. +This can for example be implemented by using an ``SerializerWithStringManifest`` +(documented in depth in :ref:`string-manifest-serializer-scala`). By looking at the string manifest, the serializer can notice +that the type is no longer needed, and skip the deserialization all-together: + +.. figure:: ../images/persistence-drop-event-serializer.png + :align: center + + The serializer is aware of the old event types that need to be skipped (**O**), and can skip deserializing them alltogether + by simply returning a "tombstone" (**T**), which the EventAdapter converts into an empty EventSeq. + Other events (**E**) can simply be passed through. + +The serializer detects that the string manifest points to a removed event type and skips attempting to deserialize it: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#string-serializer-skip-deleved-event-by-manifest + +The EventAdapter we implemented is aware of ``EventDeserializationSkipped`` events (our "Tombstones"), +and emits and empty ``EventSeq`` whenever such object is encoutered: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#string-serializer-skip-deleved-event-by-manifest-adapter + +.. _detach-domain-from-data-model-scala: + +Detach domain model from data model +----------------------------------- + +**Situation:** +You want to separate the application model (often called the "*domain model*") completely from the models used to +persist the corresponding events (the "*data model*"). For example because the data representation may change +independently of the domain model. + +Another situation where this technique may be useful is when your serialization tool of choice requires generated +classes to be used for serialization and deserialization of objects, like for example `Google Protocol Buffers`_ do, +yet you do not want to leak this implementation detail into the domain model itself, which you'd like to model as +plain Scala case classes. + +**Solution:** +In order to detach the domain model, which is often represented using pure scala (case) classes, from the data model +classes which very often may be less user-friendly yet highly optimised for throughput and schema evolution +(like the classes generated by protobuf for example), it is possible to use a simple EventAdapter which maps between +these types in a 1:1 style as illustrated below: + +.. figure:: ../images/persistence-detach-models.png + :align: center + + Domain events (**A**) are adapted to the data model events (**D**) by the ``EventAdapter``. + The data model can be a format natively understood by the journal, such that it can store it more efficiently or + include additional data for the event (e.g. tags), for ease of later querying. + +We will use the following domain and data models to showcase how the separation can be implemented by the adapter: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#detach-models + +The :class:`EventAdapter` takes care of converting from one model to the other one (in both directions), +alowing the models to be completely detached from each other, such that they can be optimised independently +as long as the mapping logic is able to convert between them: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#detach-models-adapter + +The same technique could also be used directly in the Serializer if the end result of marshalling is bytes. +Then the serializer can simply convert the bytes do the domain object by using the generated protobuf builders. + +.. _store-human-readable-scala: + +Store events as human-readable data model +----------------------------------------- +**Situation:** +You want to keep your persisted events in a human-readable format, for example JSON. + +**Solution:** +This is a special case of the :ref:`detach-domain-from-data-model-scala` pattern, and thus requires some co-operation +from the Journal implementation to achieve this. + +An example of a Journal which may implement this pattern is MongoDB, however other databases such as PostgreSQL +and Cassandra could also do it because of their built-in JSON capabilities. + +In this aproach, the :class:`EventAdapter` is used as the marshalling layer: it serializes the events to/from JSON. +The journal plugin notices that the incoming event type is JSON (for example by performing a ``match`` on the incoming +event) and stores the incoming object directly. + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#detach-models-adapter-json + +.. note:: + This technique only applies if the Akka Persistence plugin you are using provides this capability. + Check the documentation of your favourite plugin to see if it supports this style of persistence. + + If it doesn't, you may want to skim the `list of existing journal plugins`_, just in case some other plugin + for your favourite datastore *does* provide this capability. + +**Alternative solution:** + +In fact, an AsyncWriteJournal implementation could natively decide to not use binary serialization at all, +and *always* serialize the incoming messages as JSON - in which case the ``toJournal`` implementation of the +:class:`EventAdapter` would be an identity function, and the ``fromJournal`` would need to de-serialize messages +from JSON. + +.. note:: + If in need of human-readable events on the *write-side* of your application reconsider whether preparing materialized views + using :ref:`persistence-query-scala` would not be an efficient way to go about this, without compromising the + write-side's throughput characteristics. + + If indeed you want to use a human-readable representation on the write-side, pick a Persistence plugin + that provides that functionality, or – implement one yourself. + + +.. _list of existing journal plugins: http://akka.io/community/#journal-plugins + +.. _split-large-event-into-smaller-scala: + +Split large event into fine-grained events +------------------------------------------ + +**Situation:** +While refactoring your domain events, you find that one of the events has become too large (coarse-grained) +and needs to be split up into multiple fine-grained events. + +**Solution:** +Let us consider a situation where an event represents "user details changed". After some time we discover that this +event is too coarse, and needs to be split into "user name changed" and "user address changed", because somehow +users keep changing their usernames a lot and we'd like to keep this as a separate event. + +The write side change is very simple, we simply persist ``UserNameChanged`` or ``UserAddressChanged`` depending +on what the user actually intended to change (instead of the composite ``UserDetailsChanged`` that we had in version 1 +of our model). + +.. figure:: ../images/persistence-event-adapter-1-n.png + :align: center + + The ``EventAdapter`` splits the incoming event into smaller more fine grained events during recovery. + +During recovery however, we now need to convert the old ``V1`` model into the ``V2`` representation of the change. +Depending if the old event contains a name change, we either emit the ``UserNameChanged`` or we don't, +and the address change is handled similarily: + +.. includecode:: code/docs/persistence/PersistenceSchemaEvolutionDocSpec.scala#split-events-during-recovery + +By returning an :class:`EventSeq` from the event adapter, the recovered event can be converted to multiple events before +being delivered to the persistent actor. diff --git a/akka-docs/rst/scala/persistence.rst b/akka-docs/rst/scala/persistence.rst index 946c81c8a0..db11a50c69 100644 --- a/akka-docs/rst/scala/persistence.rst +++ b/akka-docs/rst/scala/persistence.rst @@ -597,10 +597,6 @@ configuration key. The method can be overridden by implementation classes to ret Event Adapters ============== -.. note:: - - Complete documentation featuring use-cases and implementation examples for this feature will follow shortly. - In long running projects using event sourcing sometimes the need arises to detach the data model from the domain model completely. @@ -634,10 +630,7 @@ indeed adapt it return the adapted event(s) for it, other adapters which do not adaptation simply return ``EventSeq.empty``. The adapted events are then delivered in-order to the ``PersistentActor`` during replay. .. note:: - More advanced techniques utilising advanced binary serialization formats such as protocol buffers or kryo / thrift / avro - will be documented very soon. These schema evolutions often may need to reach into the serialization layer, however - are much more powerful in terms of flexibly removing unused/deprecated classes from your classpath etc. - + For more advanced schema evolution techniques refer to the :ref:`persistence-schema-evolution-scala` documentation. .. _persistent-fsm: @@ -885,6 +878,8 @@ it must add to the application configuration. If not specified, a default serializer is used. +For more advanced schema evolution techniques refer to the :ref:`persistence-schema-evolution-scala` documentation. + Testing ======= diff --git a/akka-docs/rst/scala/serialization.rst b/akka-docs/rst/scala/serialization.rst index d4d1da4301..b8c2a98d5a 100644 --- a/akka-docs/rst/scala/serialization.rst +++ b/akka-docs/rst/scala/serialization.rst @@ -103,11 +103,13 @@ bytes to different objects. Then you only need to fill in the blanks, bind it to a name in your :ref:`configuration` and then list which classes that should be serialized using it. +.. _string-manifest-serializer-scala: + Serializer with String Manifest ------------------------------- The ``Serializer`` illustrated above supports a class based manifest (type hint). -For serialization of data that need to evolve over time the `SerializerWithStringManifest` +For serialization of data that need to evolve over time the ``SerializerWithStringManifest`` is recommended instead of ``Serializer`` because the manifest (type hint) is a ``String`` instead of a ``Class``. That means that the class can be moved/removed and the serializer can still deserialize old data by matching on the ``String``. This is especially useful