When it comes to distributing the load between database and application server, web server, and internal report servers, often various approaches were discussed some purely by ideology driven. Some realistic real world examples:
Nearly all load should be in the memory of application and web servers with many dynamic objects, and almost NO load should hammer the database.
Only Entity Framework Core
No EFCore at all, because only Stroed Procedures can be administrated more secure. and last but not least can guarantee atomicity, fetch of reduced result sets, that you really need and NOT huge views from the entire database.
Optimized stored procedures with execution plan sniffing will solve heavy load problem.
Entity Framework Core with stored procedures is also must have for 4.
EFCore SProcs is only a nuget package of unknown origin, I only trust Microsoft.
Reducing wait time of (dead-)locks in case of only read access by uncommittable reads, that totally avoid table and row locks
Fast memcaches to partially buffer the database only write-through works must implement lazy loading strategies clever buffering, instead fully write through
...
To understand the situation better, I draw 2 different scenarios and you will immediately see why the database in Scenario 1 is always under heavy load and further load is critical,
while the database in Scenario 2 is almost always idle.
What I mean you really must take care to avoid any further huge db load in scenaria 1, but not in scenario 2.
If you want for your external business application in a scenario 2 (most cloud databases are optimized on relational data and databases are stored often on a seperated optimized disk in raw format, so this is already a performance advantage to c:\*.mdf;*,ldf, where all windows services and system programs permantly have high IO, see https://youtu.be/ybNXf4t4zT4) then contact cloud pilots to see your database in azured mediterranean sea or tech racer to get more amazon power, instead under heavy violent high-pressure thunderstorms.
If you like more european clouds, I found https://clouding.io/ in Barcelona and transfered Paris amazon locartion to it. Spanish cloud in Madrid and US in west virginia is still amazon.
You know why?
Because a lot of companies with 1-2 business application mostley hammer their own database from inside and produce them self a lot of traffic and database load, because they want to keep their business important. Moving an application and database to the cloud is truly truthfulness, because it allows you to better understand attitudes of customers, internal users and bots, who visit your application. A realisitc view is better to plan for the future and rethink strategies of re-.growing your business. If you want to grow, you can dynamically and quickly scale up CPUs, memory, and disk space in the cloud.
Wenn Studenten im Sommersemster 1992 in der Vorlesung Graphentheorie und Kombinatorik von Prof. Gerd Baron lauter wurden, nebenbei am Laptop für andere Übungen zu koodieren begannen oder sich zu unterhalten oder zu Essen begannen, dann wiederholte Professor Baron mit lauter Stimme:
Wir haben hier ein Universum und es geht um die Anzahl der Anordnungen der Elemente einer endlichen Menge.
We have a universe here and it's all about of the number of combinations of items in a finite set.
Professor Baron war für die Entstehung der Vorlesung + Übung Graphentheorie und Kombinatorik als zusätliches Fach zu Analysis, Algebra und linearer Algebra für Informatiker mitentscheidend. Prof. Baron war der Meinung, dass Graphentheorie (inklusive gewichteter Pfade + Adjazenzmatrix Darstellung) für Informatiker wegen Verständnis von Routing Tabellen ip routing graphund Suche nach dem kürzestem Routing Pfad und Algorithmen wie dem traveling salesmen essentliell seien und Kombinatorik für Informatiker wegen oft vieler fast gleichwertiger Lösungsmöglichkeiten essentiell sei:
In den Jahren 2021-2023 [ CV ] implementierte ich nach der Idea von Georg Toth mit ihm gemeinsam SUPU (SUdocu PUzzle). Für das Feature "Game Automation", wo der Computer die Hälte des Spielbretts automatisch vorlegt und der Spieler nur noch die obere Hälfte selbst setzen muss. brauchte ich eine heuristischen einfachen, aber genügend performanten Algorithmus mit lauter unterschiedlichen Kombinationen pro Durchlauf für den Computer und ich erinnerte mich an Professor Baron.
Nach einem Treffen mit meinem alten Freund, dem Mathematik- und Physikprofessor Michael F. (der ebenfalls im Finanzsektor in der Londoner City tätig war), und unserem Gespräch über invertierbare Matrizen, wurde ich nachts mit einigen technischen Hilfsmittlen penetriert und äußerte meine Idee laut. Anstatt die Information jedoch nur Unbekannten (vielleicht russischen oder rechtsextremen Spionen) zukommen zu lassen, verfasste ich diesen Artikel, damit jeder, auch alle Partner in den USA, davon Kenntnis nimmt.
Einfachste Art AES nach oben zu skalieren: Kombinieren mehrerer Blockciphers mit Permutation
Verschlüsselung: (zuletzt base64 mime kodieren oder uuencode für ASCII Cipher Text) plain text ⟶ AES ⟶ 2-fish⟶ 3DES PBox (scrambled) ⟶ base64 ⟶cipher ascii
Entschlüsselung: (zuerst base64 oder uudecode und dann symmetrische Entschlüsselung) cipher ascii⟶ base64 ⟶3DES SBox(scrambled) → 2-fish→ AES ⟶ plain text
Man kann jetzt natürlich durch Enumerierung der einzelnen Symmetrischen Cipher Algorithmen eine Pipe skizzieren: 3DES = 0x1 AES = 0x2 2Fish = 0x4 Serpent = 0x8
Hexedezimal 0x148 für Verschlüsseln bedeuted 0x841 für Entschlüsseln. plain ⟶ (3DES→2Fish→Serpent) ⟶⟶ encrypted encrypted ⟶ (Serpent→2Fish→3DES) ⟶ plain
Beispiele für Kombinationen von mehreren symmetrischen Ciffrier-Algoríthmen:
Angenommen, es ∃ ein-ein-deutige deterministische umkehrbare Funktionen, wo es zu jeder Funktion y=F(x,...) eine entsprechende Umkehrfunktion x =f(y,..) gibt =>, dann ∃ zur Funktionenkette y = F( G( H( I( J( K( L( M( N(x, ...))))))))) die Umkehrfunktion x = n( m( l( k( j( i( h( g( f(y,...))))))))).
Ansatz eines mathematischen Beweises
Man kann jede Abbildung von ascii8 → ascii8
immer auch als Matrix vom R256 ➝ R256 betrachten.
Ein einfacher Matrixverschlüsselungsalgorithmus von mir selbst:
Ich habe einen einfachen symmetrischen Matrixverschlüsselungsalgorithmus gefunden, der als einfache symmetrische Chiffre funktioniert mit NxN-Matrix-Transformation, nachdem ich diese Frage hier auf math.stackexchange.com/questions/4915786/ gestellt hatte.
Später entwickelte ich einen sehr einfachen Blockchiffre-Algorithmus namens ZenMatrix(um zu zeigen, dass ich selbst eine sehr einfache symmetrische Blockchiffre für die Ver- und Entschlüsselung schreiben kann)
Es stehen nun weitere symmetrische Verschlüsselungsalgorithmen zur Verfügung!
Zuerst wollte ich die symmetrische Verschlüsselungspipeline nur mit AES, Blowfish, 2-Fish, 3-DES und ZenMatrix realisieren. Dann stieß ich jedoch auf die Legion von Bouncy-Castle, die mehrere Verschlüsselungen in einer Open-Source-Bibliothek anbietet, die auch hier auf GitHub verfügbar ist: https://github.com/bcgit. Daraufhin habe ich Area23.At.Mono mit dem Bouncy-Castle-Wrapper für 3DES, 2FISH, 3FISH, AES, Rijndael (entspricht AES) und Serpent neu geschrieben.
Später fügte ich der symmetrischen Verschlüsselungspipeline die folgenden Algorithmen hinzu, da ich sie im Bouncy-Castle-Paket gesehen hatte: Camellia, Cast[56], Gost28147, Idea, RC[26], RC532, Seed, Skipjack, Tea, Tnepres und XTea.
PermAgainCrypt [WinForm Demo]
Ich schrieb eine einfache WinForm-Anwendung mit reduziertem Framework-Code, um die grundlegende SymmCipher-Pipe-Verschlüsselung zu verstehen. Sie ist hier auf GitHub zu finden: https://github.com/heinrichelsigan/PermAgainCrypt
Bei zwei symmetrischen Verschlüsselungsalgorithmen ohne Wiederverwendung wäre der Wert 2! = 2, bei Wiederverwendung (z. B. Blowfish => Blowfish =>) 2² = 4.
Bei acht symmetrischen Verschlüsselungsalgorithmen ohne Wiederverwendung wäre der Wert 8! = 40,320, bei Wiederverwendung 8⁸ = 16,777,216.
In der oben beschriebenen symmetrischen Verschlüsselungspipeline mit nun 21 symmetrischen Verschlüsselungsalgorithmen wäre der Wert 2¹⁸ = 37,822,859,361, da die Pipeline-Länge auf acht Stufen begrenzt ist.
Warum veröffentliche ich diesen Artikel?
Leider neige ich seit meiner Diagnose einer schizoaffektiven Störung im Jahr 2007 manchmal dazu, laut zu sprechen und habe oft Angst, abgehört zu werden. Selbst größere Unternehmen, bei denen ich angestellt war (ich habe ihnen seit 2007 von meinem Problem erzählt), meinten, ich hätte in diesem Fall nicht gegen die Vorschriften verstoßen, da ich davon ausgehe, dass wir hier nicht die DDR mit der Stasi haben und das laute Wiederholen von Betrugserkennungsregeln zu Hause kein Verbrechen ist. Einmal fühlte ich mich sehr unwohl und sprach laut meine Idee für ein besseres AES aus. Um zu vermeiden, dass nur einige Leute sie verstehen würden, schrieb ich einen einfachen Prototyp und schickte diesen Artikel dann an alte Freunde, die in US-Unternehmen arbeiten.
Of course, that are a lot of Exception derived directly from System.Exception.
ExternalException, Win32Exception, WebException, IOException, SocketException and all exceptions thrown during os system operations extend SystemException or it's children.
Java
In Java Throwable (root of all errors & exceptions) extends base class object. Error and Exception both extend from Throwable.
Errors such StackOverflowError (endless recursion), OutOfMemoryError (endless allocation) and VirtualMachineError are thrown, when critical limits of java virtual machine exceeded.
In java some exceptions like IOException or SocketException are "checked at compile time". This does NOT mean, that javac compiler knows when IOException or SocketExcpetion will be thrown at program flow at runtime.
Furthermore javac compiler knows if reading from or writing to a file needs catching an IOExceptiuon, because disk might be full or USB stick could be unplugged or fs mount point is now unmounted or remounter ro. When reading from or writing to a socket javac compiler knows, that you must catch a SocketException in case of a linux system init runlevel 1 or 2, unplugging USB network adapter or dog bites CAT5 or CAT7 network cable.
C++
In C++ there is no binary split at the root of "exception tree" as in C# (System Exception &
ApplicationException) or in Java (Error & Exception both extend from Throwable).
In C++ bad_cast, bad_alloc, bad_function_call, logic_error & runtime_error extend from exception.
Most common Exceptions in C++ extend from logic_error & runtime_error.b.