Διλήμματα με smart clients
Σχετικά: Smart clients over large db schema
Έχω ένα smart client, το οποίο διαχειρίζεται έναν πίνακα σε μια βάση δεδομένων με τη γνωστή αρχιτεκτονική:
Το dal βουτάει τα δεδομένα από τη βάση, τα χώνει σε ένα dataset και τα πασάρει μέσω ενός web service στον client. Ο client cachάρει κάποια δεδομένα μεταξύ των sessions, ενημερώνει και ενημερώνεται για αλλαγές κλπ κλπ.
Η εφαρμογή αυτή είναι ένα address book (του ενός πίνακα, χάρης απλότητας του παραδείγματος), το authorization είναι απλοϊκό, όλοι οι χρήστες έχουν πρόσβαση σε όλα τα δεδομένα) και θα διατεθεί εμπορικά. Αυτό σημαίνει ότι η χρήση θα είναι διαφορετική από διαφορετικούς χρήστες. Πχ, ένας χρήστης θα την πάρει και θα κρατάει μέσα τις 100 επαφές που έχει στο outlook. Άλλος χρήστης θα την πάρει και θα κρατάει μέσα τις 1000 επαφές της επιχείρισής του. Ένας τρίτος χρήστης, μια πολυεθνική, θα κρατήσει μέσα τα στοιχεία του 1.000.000 πελατών της.
Βλέποντας τα παραδείγματα της microsoft καθώς και ότι μπόρεσα να βρω στο web, καταλαβαίνω ότι πραγματεύονται τελείως απλοϊκές καταστάσεις, περιμένοντας ότι οι χρήστες του smart client θα διαχειρίζονται μικρό όγκο δεδομένων. Πχ, το taskvision κατεβάζει μονοκόμματα όλα τα δεδομένα που αφορούν τον χρήστη για να μπορεί να δουλέψει και disconnected. Αυτό στην περίπτωσή μου είναι εφικτό μόνο στα σενάρια με τα λίγα δεδομένα, πχ με 100 ή 1.000 επαφές. Δεν είναι εφικτό όμως για την χρήση με τις 1.000.000 εγγραφές γιατί ούτε τα μεταφέρεις, ούτε τα διαχειρίζεσαι εύκολα.
Παρατηρώ λοιπόν ότι, ενώ η εφαρμογή παραμένει η ίδια ακριβώς, ο όγκος των δεδομένων του πίνακα είναι αυτός που καθορίζει την πολιτική cachaρίσματος και synchronization των δεδομένων. Οπότε σκέφτομαι ότι η εφαρμογή μου πρέπει να έχει υλοποιημένες διαφορετικές στρατηγικές, τις οποίες ή να ενεργοποιεί ο χρήστης ανάλογα με το performance που θέλει να έχει, ή να ενεργοποιούνται αυτόματα ανάλογα με τον όγκο των δεδομένων του πίνακα.
Ας εξετάσω πιθανές κατηγορίες σεναρίων, ανάλογα με το πόσα δεδομένα φέρνω σε κάθε request:
- Όλα
Ξενικάω από τα εύκολα: Αλά Microsoft, όλα σε ένα κουβά, μένουν στον client μεταξύ των sessions. Για λίγα δεδομένα είναι συγκλονιστικά καλό. Άπαιχτο performance.
- Ένα
Το ότι κάθε φορά φέρνω αυτό που μου ζητήθηκε σημαίνει ότι θα τρελαίνω τον server στα request. Επί πλέον το πηγαινέλα-time θα τρελαίνει τον χρήστη στο περίμενε. Πρέπει να μείνω όσο το δυνατόν πιο μακριά από αυτό το σενάριο.
- Χ;
Ποια είναι αυτά τα X;
Εδώ κατεβάζουμε ιδέες:
- Παραπλήσια δεδομένα. Βουτάμε μέσα στα δεδομένα και στο business intelligense που κουβαλάνε. Πχ. επαφές της ίδιας κατηγορίας; ενδέχεται όντως σε κάποιες χρήσεις αυτό να ισχύει. Οι άλλοι γιατί να περιμένουν να έρθουν πράγματα που δεν θα χρησιμοποιήσουν;
- Συχνά χρησιμοποιούμενα δεδομένα
Μαρκάρω κάθε δεδομένο με στατιστικά, να ξέρω κάθε πότε χρησιμοποιείται για να ξέρω πόσο αξίζει ή όχι να το φέρω ακόμα και αν δεν ζητήθηκε.
- Τι άλλο μπορεί να υπάρχει; Αναγκαστικά πρέπει να κολυμπήσεις μέσα σε στατιστικά χρήσης μπας και μπορέσεις να βρεις τρόπους πρόβλεψης των δεδομένων που πρόκειται να ζητήσει ο χρήστης.
Άρα με βάση το πόσα δεδομένα φέρνω, τα smart client κόλπα με βοηθάνε μόνο για λίγα δεδομένα στις γενικές περιπτώσεις.
Ας εξετάσω πιθανές κατηγορίες από την άλλη πλευρά, στο πόσα δεδομένα cachάρω στον client.
- Όλα
Ναι, για λίγα δεδομένα είναι μια χαρά, ρίχνω το dataset μου σε ένα xml στον δίσκο και everybody is happy.
- Κανένα
Άντε γεια...
- Ψ;
Πάμε πάλι ιδέες:
- Συχνά χρησιμοποιούμενα δεδομένα
Μμμμμ, ίσως να βολέψει μερικές καταστάσεις
- Τελευταία Ψ...
Και αυτό ίσως κάτι να κάνει. Ίσως ένας συνδυασμός με το προηγούμενο να έλεγε κάτι παραπάνω
- Πάλι κολλάει το μυαλό μου.
Άρα, με βάση τα δεδομένα που κρατάω στον client, τα smart client κόλπα πάλι δεν μου προσφέρουν πολλά για μεγάλο όγκο δεδομένων.
Καταλήγω λοιπόν στα εξής συμπεράσματα:
- Όταν τα δεδομένα είναι λίγα (μπορούν να κατέβουν σε αποδεκτό χρόνο και να τα διαχειρίζεται αποτελεσματικά ο client) τα φέρνω όλα και τα cachάρω όλα
- Όταν τα δεδομένα είναι πολλά, κάνω κάνα δυο πατεντίτσες που μπορώ να σκεφτώ και τα αφήνω στο έλεος του δικτύου...
Τώρα, για το που τελειώνει το λίγο και αρχίζει το πολλά, μάλλον βγαίνει από αυτό που έγραψα: Βλέπω πόσο γρήγορα κατεβάζει ο client και τι resources έχει, και αποφασίζω πιο μοντέλο θα ακολουθήσω realtime.
Τα πραγματικά σενάρια που παίζω είναι δύο.
- Το πρώτο είναι ένα CMS με κατηγορίες, άρθρα, προϊόντα, αρχεία, εικόνες. Είναι ήδη στην αγορά και υπάρχουν τελείως διαφορετικά σενάρια χρήσης. Άλλος έχει περασμένες 10 κατηγορίες, 30 προϊόντα και 2 χρήστες, άλλος έχει 20 κατηγορίες, 20.000 προϊόντα και 10 χρήστες.
- Το δεύτερο είναι μια ασφαλιστική εφαρμογή. Και εδώ τα σενάρια τρελαίνονται. Ο ένας ασφαλιστής έχει 150 πελάτες και τα συμβόλαιά τους, ο άλλος έχει ολόκληρο γραφείο και έχει 5.000 πελάτες και συμβόλαια.
Οδηγούμαι λοιπόν στο συμπέρασμα, ότι ωραίο ακούγεται το slogan "smart client" αλλά στην πράξη είναι ανεφάρμοστο. Ακόμα και με το task vision την MS δηλαδή, αν το πουλήσεις σαν προϊόν και ο άλλος πάει και περάσει μέσα 10.000 tasks, το προϊόν πάει περίπατο. Από την άλλη αν πας να το σχεδιάσεις ώστε να υποστηρίζει και τέτοιες περιπτώσεις, τρως τα μούτρα σου με διλήμματα σαν τα δικά μου....
Μήπως κάτι δεν έχω καταλάβει καλά; Υπάρχει κάποιος που κατεβάζει ποιο πολλές ιδέες και διαβάζει αυτό το blog;
Για πείτε κάνα σχόλιο...