{"id":2885,"date":"2017-09-24T00:00:00","date_gmt":"2017-09-24T00:00:00","guid":{"rendered":"https:\/\/structr.com\/verkuerzung-der-bereitstellungszeiten-um-bis-zu-95\/"},"modified":"2017-09-24T00:00:00","modified_gmt":"2017-09-24T00:00:00","slug":"verkuerzung-der-bereitstellungszeiten-um-bis-zu-95","status":"publish","type":"post","link":"https:\/\/structr.com\/de\/blog\/verkuerzung-der-bereitstellungszeiten-um-bis-zu-95\/","title":{"rendered":"Verk\u00fcrzung der Bereitstellungszeiten um bis zu 95"},"content":{"rendered":"<p>Seit wir das Deployment-Feature in Structr 2.1 eingef\u00fchrt haben, ist unsere Produktivit\u00e4t stetig gestiegen.<br \/>\nDie M\u00f6glichkeit, schnell eine komplett emtpy Structr-Instanz aufzusetzen und eine bestehende Anwendung ohne die Benutzerdaten zu deployen, hat sich als sehr bequemer und schneller Weg erwiesen, neue Features zu testen\/entwickeln. Ganz zu schweigen von den anderen Vorteilen wie Versionskontrolle, Erleichterung der Arbeit mit mehreren Entwicklern und so weiter&#8230; <\/p>\n<p>Mit der zunehmenden Gr\u00f6\u00dfe der Structr-Anwendungen und den wachsenden Nutzerdaten kam es jedoch zu einem drastischen Anstieg der Bereitstellungszeiten, wenn es darum ging,<br \/>\nneue Versionen einer Structr-Anwendung in die Live-Umgebung zu \u00fcbertragen. Eine Anwendung ben\u00f6tigte satte 60 Minuten (!) f\u00fcr den Import &#8211; zugegebenerma\u00dfen auf einem etwas schwachen Server, aber immer noch eine v\u00f6llig inakzeptable Ausfallzeit f\u00fcr eine Anwendung.<br \/>\nAlso beschloss ich zu untersuchen, ob die Bereitstellungszeiten verbessert werden k\u00f6nnten &#8211; mit erstaunlichen Ergebnissen. <\/p>\n<h4 id=\"die-untersuchung\">Die Untersuchung<\/h4>\n<p>Durch die Verwendung von jstack, um Stack Traces einer Structr-Instanz w\u00e4hrend eines Deployment-Imports zu erfassen, wurde mir schnell klar, dass die langsamen Geschwindigkeiten durch<br \/>\neine Kombination von Structrs Kernfunktionen verursacht wurden: Kardinalit\u00e4tserzwingung und Sicherheit.<\/p>\n<h4 id=\"durchsetzung-der-kardinalitaet\">Durchsetzung der Kardinalit\u00e4t<\/h4>\n<p>Im <a href=\"https:\/\/support.structr.com\/article\/193\">Schema-Editor<\/a> k\u00f6nnen die Kardinalit\u00e4tsregeln f\u00fcr Beziehungen definiert werden.<br \/>\nIm Wesentlichen gibt es vier M\u00f6glichkeiten:  <code>OneToOne<\/code>,  <code>OneToMany<\/code>,  <code>ManyToOne<\/code>  und  <code>ManyToMany<\/code>. Jedes Mal, wenn eine Beziehung erstellt wird, pr\u00fcft Structr, ob die Kardinalit\u00e4tsregeln verletzt werden. <\/p>\n<h4 id=\"sicherheit\">Sicherheit<\/h4>\n<p>Jedes Mal, wenn ein Knoten erstellt wird, werden zwei Beziehungen erstellt. Eine Beziehung, die den Eigent\u00fcmer identifiziert, und eine, die die Erstellerrechte f\u00fcr den Knoten gew\u00e4hrt. Beide Beziehungen verweisen auf den Benutzer, der den Knoten erstellt hat.<br \/>\nDie Kardinalit\u00e4t ist OneToMany f\u00fcr die Eigent\u00fcmerschaft (ein Knoten kann genau einen Eigent\u00fcmer haben und ein Benutzer kann viele Knoten besitzen) und <code>ManyToMany<\/code> f\u00fcr Sicherheitszusch\u00fcsse (ein Benutzer kann mehrere Sicherheitszusch\u00fcsse haben und ein Knoten kann ebenfalls mehrere Sicherheitszusch\u00fcsse haben).  <\/p>\n<h4 id=\"das-problem\">Das Problem<\/h4>\n<p>Wie man wahrscheinlich sehen kann, f\u00fchrt die Erstellung vieler Knoten (wie bei der Erstellung von Seiten) zu einer Vielzahl von Beziehungen zu dem Benutzerkonto, das man verwendet &#8211; wahrscheinlich der Benutzer &#8222;admin&#8220;.<br \/>\nDa Sicherheitsberechtigungen f\u00fcr die unterschiedliche Darstellung von Seiten f\u00fcr verschiedene Benutzer unerl\u00e4sslich sind, m\u00fcssen diese Beziehungen in den Deployment-Export aufgenommen werden, wenn man<br \/>\ndie Anwendung auf eine andere Instanz \u00fcbertragen m\u00f6chte. Und genau hier liegt das Problem &#8211; beim Importieren eines Deployment-Exports m\u00fcssen wir pr\u00fcfen, ob die Beziehungen die Kardinalit\u00e4tsregeln verletzen.<br \/>\nWenn ein Knoten sehr viele Beziehungen dieses Typs hat, dauert die Pr\u00fcfung eine Weile (und wird immer langsamer, je mehr Beziehungen angeh\u00e4ngt werden).<br \/>\nF\u00fcr <code>OneToOne<\/code>, <code>OneToMany<\/code> und <code>ManyToOne<\/code> gab es eine intelligente Strategie: Pr\u00fcfen Sie immer von der Seite der Beziehung aus, die den &#8222;One&#8220;-Teil darstellt, da es nur eine<br \/>\nBeziehung geben kann. F\u00fcr <code>ManyToMany<\/code> funktioniert diese Optimierung nicht, da beide Enden viele Beziehungen haben k\u00f6nnen. Diese Richtung war zuf\u00e4llig von der Quelle zum Ziel.<br \/>\nIn unserem speziellen Fall war dies ein Problem, weil dies w\u00e4hrend der Bereitstellung die Richtung Benutzer-&gt;Knoten war und der Benutzer der Knoten mit der st\u00e4ndig wachsenden Anzahl von Beziehungen war.   <\/p>\n<h4 id=\"die-loesung\">Die L\u00f6sung<\/h4>\n<p>Die L\u00f6sung war so einfach wie die Umkehrung der Pr\u00fcfrichtung von &#8222;Quelle zu Ziel&#8220; zu &#8222;Ziel zu Quelle&#8220;. Dies funktioniert, weil die Pr\u00fcfung zum Zeitpunkt der Erstellung erfolgt und zu diesem Zeitpunkt<br \/>\nder Benutzer bereits viele Beziehungen haben kann und der zuvor erstellte Knoten+Beziehung nur eine Handvoll Beziehungen haben kann.<br \/>\nMit diesem Ansatz konnte die Bereitstellungszeit (f\u00fcr diese spezielle Anwendung) <strong>von etwa 60 Minuten auf etwa 3 Minuten reduziert werden<\/strong>.<br \/>\nDie Bereitstellung dieser Anwendung in einer leeren Datenbank dauerte vorher etwa 300 Sekunden und dauert jetzt etwa 100 Sekunden. Eine allgemeine Faustregel lautet: Je mehr Daten in der Datenbank vorhanden sind, die f\u00fcr einen Benutzer\/eine Gruppe im Bereitstellungsexport gew\u00e4hrt werden, desto mehr Zeit wird mit dem neuen Ansatz eingespart.  <\/p>\n<h4 id=\"eine-weitere-sache\">Eine weitere Sache<\/h4>\n<p>Wir haben die Dinge weiter verbessert! In neueren Versionen haben wir ein Flag zum Typ <code>User<\/code> hinzugef\u00fcgt, das f\u00fcr Admin-Benutzer gesetzt werden kann. Wenn dieses Flag gesetzt ist, legt Structr keine Beziehungen f\u00fcr Eigentum und Sicherheit (f\u00fcr diesen Benutzer) an, was die Geschwindigkeit erh\u00f6ht und auch die Exporte bereinigt. \u00d6ffnen Sie einfach den Dialog &#8222;Eigenschaften bearbeiten&#8220; f\u00fcr den Benutzer im Bereich &#8222;Sicherheit&#8220; und suchen Sie nach &#8222;Sicherheitsbeziehungen \u00fcberspringen&#8220;.   <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seit wir das Deployment-Feature in Structr 2.1 eingef\u00fchrt haben, ist unsere Produktivit\u00e4t stetig gestiegen. Die M\u00f6glichkeit, schnell eine komplett emtpy \u2026<\/p>\n","protected":false},"author":4,"featured_media":2887,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[612,543],"tags":[619,549,552,614,554,593,618,617,613,616,550,583,605,615,585,548,545,586],"class_list":["post-2885","post","type-post","status-publish","format-standard","hentry","category-programmierung","category-structr-de","tag-anwendungsbereitstellung","tag-automatisierung","tag-backend-de","tag-bereitstellung","tag-datenbank","tag-devops-de","tag-exportieren","tag-importieren","tag-it-de","tag-kardinalitat","tag-kodierung","tag-leistung","tag-optimierung","tag-produktivitat","tag-sicherheit","tag-software-entwicklung","tag-structr-de","tag-systemarchitektur"],"acf":[],"_links":{"self":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/posts\/2885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/comments?post=2885"}],"version-history":[{"count":0,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/posts\/2885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/media\/2887"}],"wp:attachment":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/media?parent=2885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/categories?post=2885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/tags?post=2885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}