Manual
Transcrição
Manual
Manual des Online Betting System BetGetter und Viveo Version: Kontext: Autoren: Betreuer: Kontakt: Datum: 1.0 Laborprojekt "Online Betting System", Distributed Computing Group, ETH Zürich, 2003/04 Gregor Bättig, Stefan Bollmann, Andreas Diener, Fabian Nart und Christian Wassmer Ruedi Arnold [email protected] 26. Februar 2004 Inhaltsverzeichnis 1. 2. Einleitung........................................................................................................ 4 Architektur ...................................................................................................... 5 2.1. Übersicht ................................................................................................. 5 2.2. BetGetter ................................................................................................. 5 2.3. Viveo....................................................................................................... 6 3. Spiellogik ........................................................................................................ 8 3.1. Anleitung................................................................................................. 8 3.2. Quoten................................................................................................... 10 3.3. Future Work .......................................................................................... 11 4. Testwoche ..................................................................................................... 14 4.1. Einleitung.............................................................................................. 14 4.2. Setting ................................................................................................... 14 4.3. Probleme ............................................................................................... 14 4.4. Statistiken.............................................................................................. 15 4.5. Akzeptanz beim Publikum.................................................................... 18 4.6. Persistenz .............................................................................................. 19 4.7. Performancetest..................................................................................... 20 5. Installation / Konfiguration........................................................................... 21 5.1. Installation der Entwicklungs-Umgebung ............................................ 21 5.2. Eclipse-Einstellungen ........................................................................... 21 5.3. Konfiguration des Systems ................................................................... 21 5.4. Starten des Systems............................................................................... 22 5.5. Daten einlesen....................................................................................... 22 Anhang A: Interfacedefinition Frontend – Backend............................................. 24 Anhang B: Datenmodell ....................................................................................... 27 Anhang C: DNS Round-Robin und Dynamic DNS.............................................. 28 -2- -3- 1. Einleitung Seit Anbeginn der Zeit ist Wetten ein Bestandteil der menschlichen Kultur. BetGetter und Viveo sind Komponenten eines Online Betting System, das den Gedanken des Wettens in das digitale Zeitalter transferiert. Dieses, als Teil eines Laborprojektes konzipierte System, ist verteilt, ausfallsicher und lastbalanciert implementiert. Sinn dieses Dokumentes ist es, dem späteren Betreiber und Weiterentwickler einen technischen Überblick zu geben. Einzelheiten zur Implementierung finden sich im folgenden Kapitel. Anschliessend, in Kapitel 3, wird die Spiellogik beschrieben. Information über Wettquoten sowie künftige Verbesserungsmöglichkeiten werden ebenfalls in diesem Kapitel behandelt. Kapitel 4 beinhaltet die Resultate einer einwöchigen Testwoche sowie die Auswertung einer anschliessenden Umfrage. Hinweise zu Installation und Konfiguration finden sich in Kapitel 5. Diagramme sowie Definitionen sind in den Anhängen zu finden. -4- 2. Architektur Aus Gründen der Benutzbarkeit lag es nahe, einer Webapplikation den Vorzug zu geben. Im Folgenden wird die Architektur des Online Betting System beschrieben. 2.1. Übersicht Im Sinne einer Wiederverwendbarkeit für verschiedene Sportanlässe wurde das System in einen generischen Backend-Teil und einen anlass-spezifisches Frontend-Teil aufgeteilt. Ersterer, genannt BetGetter, bietet allgemeine Funktionalitäten für die Verwaltung von Wetten, Spielern, Spielen und dergleichen an. Viveo, die graphische Benutzeroberfläche, wurde für die Testwoche entwickelt und auf Eishockey-Spiele der National Hockey League NHL [NHL] ausgelegt. Viveo greift auf die Funktionalität von BetGetter über eine wohldefinierte Schnittstelle, das ApplicationBean, zu. Abbildung 1 stellt eine schematische Übersicht der genannten Komponenten dar. In Anhang A ist die gesamte Schnittstellenfunktionalität des ApplicationBean zu finden. Abbildung 1 Übersicht der Architektur von BetGetter Das Online Betting System läuft als Webapplikation im Web-Application-Server Tomcat [Tomcat], welcher auch gleichzeitig als Web-Server fungiert. Java Server Pages (JSP) generieren die im Webbrowser des Benutzers dargestellte HTML-Seite. Dazu wird über das ApplicationBean auf die Spiellogik zugegriffen. Der Forschungsprototyp Clippee [Clippee] stellt die Verteilung der Spieldaten sicher. 2.2. BetGetter BetGetter, zu Deutsch "WettErreger", ist in Java realisiert. Eine auf das Wesentliche beschränkte Darstellung in UML ist in Anhang B zu finden. -5- 2.2.1. Verteilte Datenhaltung Sämtliche im System gehaltenen Daten-Objekte erben von der Klasse DataObject aus dem Package clippee. Clippee ist eine Client-Peer Architektur, welche Dienste ähnlich einem Gruppenkommunikationssystem anbietet. Das Kernstück des Systems bildet ein Objekt der Klasse BetGetterPeer, welches als Singleton instanziiert wird. Beim Erstellen versucht ein solcher BetGetterPeer sich zuerst mit anderen aktiven Peers als Joining-Peer zu verbinden. Die IP-Adressen potentieller Partner-Peers sind in einem Konfigurations-File zu definieren. Falls keine Verbindung zu Stande kommt, führt er die Initialisierungsroutine als First-Peer aus und wartet auf eingehende Verbindungen anderer Peers. 2.2.2. Lokale Datenreferenzierung Um lokal über sämtliche Datenobjekte wie User, Match, etc. iterieren zu können, werden Referenzen auf diese in Hash-Maps abgelegt. Diese Hash-Maps werden mittels Observer-Pattern aktuell gehalten. 2.2.3. Filter Um Matches und Wetten nach bestimmten Kriterien filtern zu können, wird das Composite-Pattern benutzt. So können Filter über verschiedene Dimensionen wie Zeit, Team oder Wetten zu einem einzigen Filter kombiniert werden. 2.3. Viveo Viveo ist der von Aussen sichtbare Teil des Online Betting System. Diese graphische Oberfläche wurde durch mehrere *.jsp Files umgesetzt, welche den hohen Anforderungen des strikten XHTML-Standards von W3C [W3C] gerecht werden. Für die Formatierung der Seiten wurden Cascading Style Sheets (CSS) verwendet. Es wurde auf eine intuitiv bedienbare, stilvolle Gestaltung der Benutzeroberfläche Wert gelegt. -6- Abbildung 1: Aufbau einer Java Server Page Die Oberfläche besteht aus verschiedenen zusammenstellbare Einheiten bilden. JSPs, welche modularartig Alle Seiten, die auf die Backend-Funktionaliät von BetGetter zugreifen, tun dies über das ApplicationBean, welches pro Tomcat-Instanz genau einmal vorhanden ist. Um Wetten platzieren zu können, muss sich ein User einloggen. Zu diesem Zeitpunkt wird auf der Serverseite ein SessionBean erzeugt. Tomcat verwaltet verschiedene User Sessions mit Hilfe von Cookies. -7- 3. Spiellogik 3.1. Anleitung 3.1.1. Ziel des Online Betting System Es ist das Ziel des Spiels, durch geschicktes Wetten das Startguthaben zu vermehren. Dabei ist es möglich, in Tippgemeinschaften, so genannten Cliquen, als Team zu reüssieren. Somit werden Ranglisten für Einzelspieler als auch für Cliquen geführt. • Es gewinnt derjenige Einzelspieler, der am Ende des Spieles die meisten Punkte auf seinem Konto hat. • Es gewinnt diejenige Clique, deren Mitglieder am Ende des Spieles im Durchschnitt die meisten Punkte haben. Besitzt ein Spieler kein Guthaben mehr, ist für ihn das Spiel vorzeitig beendet. 3.1.2. Rangliste • Es erscheinen nur Spieler, die mindestens eine Wette abgeschlossen haben, in der Rangliste. Die Rangliste basiert auf dem Guthaben der Spieler. • Es erscheinen nur Cliquen auf der Cliquen-Rangliste, die mindestens zwei Mitglieder haben, welche bereits gewettet haben. Die Rangliste basiert auf der Punktezahl einer Clique, welche dem Durchschnitt der Guthaben ihrer Mitglieder entspricht. 3.1.3. Punktekonto • Jeder Spieler erhält zu Beginn ein Startguthaben von 1000 Punkten. • Wenn ein Spieler keine Punkte mehr auf seinem Konto hat, kann er keine Wette mehr platzieren. 3.1.4. Wetten • Pro Spiel kann eine Wette abgeschlossen werden. • Es kann auf Heimsieg, Auswärtssieg oder Unentschieden gewettet werden. Jedes dieser Ereignisse besitzt eine Gewinnquote. • Ein Spieler kann nicht mehr Punkte setzen als er auf seinem Konto hat. • Der maximale Einsatz pro Spiel beträgt 3000 Punkte. • Der Wetteinsatz wird sofort nach Wettabschluss vom Konto abgezogen. • Es werden die Resultate am Ende des Spiels (nach einer eventuellen Verlängerung) ausgewertet. • Bei gewonnener Wette wird der Wetteinsatz multipliziert mit der entsprechenden Gewinnquote auf das Konto gutgeschrieben. • Vorsicht! Einmal abgeschlossen, kann eine Wette nicht mehr geändert werden! -8- 3.1.5. Cliquen Eine Clique ist eine Gemeinschaft von Spielern. Sowohl die Mitglieder einer Clique untereinander, als auch die verschiedenen Cliquen können sich mittels der Ranglisten vergleichen. Jeder Spieler kann beliebig viele Cliquen gründen und bestehenden Cliquen beitreten. Des Weiteren lassen sich alle Cliquen und ihre Mitglieder betrachten. Der Gründer einer Clique ist zugleich der Cliquen-Boss und kann neue Mitglieder akzeptieren oder ablehnen. 3.1.6. Mögliche Aktionen Wetten abschliessen Wähle in der Navigation Wette abschliessen. Die angezeigten Spiele kannst du nach Team und/oder Zeit filtern. Um eine Wette abzuschliessen, setze auf das gewinnende Team (1 / 2) oder auf Unentschieden (x) und gebe den Wetteinsatz ein. Schliesse die Wette durch Klicken des "Ok" Buttons ab. Vorsicht! Eine Wette kann nicht mehr geändert werden. Abbildung 2: Wette abschliessen Eigene Wetten betrachten Um die eigenen Wetten auf noch nicht begonnene Spiele zu betrachten, wähle in der Navigation Meine Wetten. Ist das Spiel bereits beendet, lassen sich unter Meine Resultate die Ergebnisse betrachten. Die Anzeige lässt sich nach Teams und/oder Zeit filtern. Clique gründen Wähle in der Navigation Cliquen und gebe unter Neue Cliquen gründen einen neuen Cliquenamen ein. Clique beitreten Wähle in der Navigation Cliquen und wähle unter Clique beitreten den Cliquenamen. Bestätige die Eingabe durch Drücken des OK Buttons. Falls dich der Leader der gewählten Clique akzeptiert, wirst du in die Clique aufgenommen. Sind alle Spiele vorbei, kann man keiner Clique mehr beitreten. Eigene Cliquen anzeigen Wähle in der Navigation Cliquen. Durch Anklicken der Clique unter Meine Cliquen siehst du die Mitglieder der Clique sowie deren Rangliste. Hier kannst du auch neue Mitglieder einladen. Als Clique Leader kannst Du zudem die Anträge um Clique-Beitritt von Spielern akzeptieren oder ablehnen. Andere Cliquen anzeigen -9- Wähle in der Navigation Cliquen und wähle unter Clique suchen den Cliquenamen. Bestätige die Eingabe durch Drücken des OK Buttons. Nun kannst Du die Mitglieder der Clique und deren interne Rangliste betrachten. 3.2. Quoten Ein Wettsystem mit Quoten, welche für jedes Spiel und jeden Ausgang gleich sind (wie in der Testwoche), verleitet den Spieler dazu, sein ganzes Punktvermögen auf ein Spiel – nämlich das “sicherste” - zu setzen. Das Wettsystem verliert dadurch an Spannung. Mit einer variablen Quote würde man nicht mehr “automatisch” seine Punkte auf das “sicherste” Spiel setzen, sondern dort, wo man meint, eine hohe Quote zusammen mit einer verhältnismässig hohen Gewinnchance zu haben. Im Folgenden sind mehrere Arten, wie man solche Quote erhalten könnte, kurz beschrieben. Im Allgemeinen wird der eingesetzte Betrag im Falle eines Gewinnes multipliziert mit der Quote ausbezahlt. In der Endversion von BetGetter sind statische Quoten implementiert. 3.2.1. Statische Quoten Statische Quoten werden in den meisten Fällen von einem professionellen Buchmacher bestimmt. Dieser muss dabei über ein grosses Sportwissen sowie Erfahrung mit Wettsystemen verfügen, damit er die Spielausgänge beziehungsweise das Wettverhalten der User möglichst genau voraussagen kann. Klar favorisierte Mannschaften erhalten deshalb tiefe Quoten - teilweise fast eine Quote von eins. Klare Aussenseiter hingegen können teilweise sehr hohe Quoten erhalten. So kann ein Spieler auswählen, ob er ein grosses Risiko (mit entsprechender Gewinnchance) eingehen will und auf einen Aussenseiter setzt oder ob er einen relativ sicheren, jedoch kleinen Gewinn einfahren möchte. Das macht das System spannender. Das Problem ist, dass die Punktemenge, die sich im Spiel befindet, immer weniger wird, da die beruflichen Buchmacher die Quoten so bestimmen, dass im Schnitt für den Wettsystembetreiber ein Gewinn herausschaut. Der Vorteil hingegen ist, dass dieses System klar und gut verständlich ist. Da die Quoten fix sind, kann der Wetter sie nicht durch manipulierte Wetten beeinflussen, wie das in einem System mit dynamischen Quoten möglich ist. 3.2.2. Dynamische Quoten Bei den dynamischen Varianten werden die Quoten on-the-fly anhand des bisherigen Wettverhaltens der Benutzer berechnet. Dabei beeinflussen eben platzierte Wetten die Quoten für die nachfolgenden Wetten. Im Allgemeinen sinkt nämlich eine Quote, wenn ein Wetter einen relativ hohen Betrag auf bestimmtes Ergebnis setzt. Dies kann der gewiefte Wetter dazu ausnützen, die Quoten für sein Hauptkonto positiv zu manipulieren. Um dies zu erreichen, führt er ein oder mehrere Nebenkonti, die für ihn nur dazu da sind, fiktive Wetten abzuschliessen, welche eben die Quoten für ihn positiv beeinflussen. Dies wird erst unterbunden, wenn um echtes Geld gespielt wird. - 10 - 3.2.3. System „Jackpot“ Bei diesem System kommen alle Einsätze eines Spiels in einen Jackpot. Nach dem Spiel wird dann der Jackpot unter den Gewinnern proportional zu ihren Einsätzen verteilt. Der grosse Vorteil dieses Systems ist, dass man die sich im Spiel befindende Punktemenge steuern kann. Der Veranstalter kann nämlich immer einen gewissen Teil vom Jackpot wegnehmen oder dazutun. Der Nachteil ist, dass die Benutzer nie genau wissen können, wie ihre Gewinne sein werden. 3.2.4. System „Wettbörse“ Einen interessanten Ansatz bietet eine Wettbörse. Anstatt dass ein Buchmacher alle Quoten bestimmt, lässt man das die Wetter selber tun. Dies ist ein neuer Ansatz und es gibt Anzeichen dafür, dass solche Wettbörsen gross im Kommen sind. Der Unterschied besteht darin, dass nun nicht mehr der Buchmacher eine Wette anbietet, sondern es die Benutzer selber tun. Zum Beispiel bietet Alice eine Wette “Tipp 1, 100 Punkte, Quote 2.2” an. Bob sieht dieses Wettangebot und geht darauf ein. Das heisst, Bob überweist Alice 100 Punkte in der Meinung, dass Tipp 1 tatsächlich eintritt. Alice hatte mit diesem Wettangebot nämlich genau das Gegenteil behauptet und bot jedem Wetter an, mit 100 Punkten gegen ihre Behauptung anzutreten. Behält sie Recht, kann sie die Punkte von Bob behalten – ansonsten muss sie Bob den Einsatz multipliziert mit der Quote überweisen. Alice war somit für diese Wette der Buchmacher. Bei einem anderen Spiel kann es gerade umgekehrt sein. Dieses System bietet ein grosses Interaktionspotential und ist deshalb insbesondere für Zocker geeignet. Es braucht jedoch einen gewissen Grundstock an Spielern, vor allem solche, die sich im Sport auskennen und bereit sind, häufig Wetten anzubieten. 3.3. Future Work Auch wenn wir in der Testwoche ein grundsätzlich positives Echo erhalten haben, sehen wir noch einige Verbesserungsmöglichkeiten. 3.3.1. Objekte löschen Durch die Verwendung von Clippee sahen wir uns mit dem Problem konfrontiert, dass Objekte nicht gelöscht werden können. Dies ist nicht nur unschön, sondern kann auch zu unangenehmen Folgen führen. Zum Beispiel können Benutzer nicht gelöscht werden, welche einen unanständigen Nick führen oder das System missbrauchen. Oder – was noch schlimmer ist – wenn der Administrator ein Spiel eingibt, welches nicht existiert, kann er es nicht mehr aus dem System löschen. Demzufolge wird es auf der Liste der zu wettenden Spiele aufgeführt ohne dass das Spiel stattfindet. Mögliche Lösungen wären: • • jedes Objekt hat ein Valid-Flag, welches anzeigt, ob das Objekt noch gültig oder gelöscht ist Clippee erweitern, so dass Objekte gelöscht werden können 3.3.2. Dynamische Quoten Ein Problem der ersten Lösung des Spiels war, dass die Quoten für alle Spiele gleich sind. Weil nicht auf alle Spiele gesetzt werden muss, kann ein gewiefter - 11 - Spieler alles Geld auf diejenigen Spiele setzen, in welchen er die grösste Gewinnwahrscheinlichkeit hat. Momentan werden die Quoten vom Administrator eingegeben. Die Grundlage dazu könnten Berechnungen anderer Wettsysteme sein. Durch die statischen Quoten ist für jeden Benutzer bei der Abgabe seiner Wette sein möglicher Gewinn ersichtlich. Hingegen würden dynamische Quoten berücksichtigen, wie andere Spieler die Gewinnchancen der Teams einschätzen. Das Problem ist jedoch, dass dabei die Quote bei Wettabgabe und Spielbeginn unterschiedlich ist. Somit bleibt die Quote nicht transparent für den Wettenden. Mögliche Lösungen wären dafür: • keine Anzeige der Quoten bei der Wettabgabe: Dadurch kann der Benutzer aber nicht abschätzen, wie viel er gewinnen kann (ist also Lotterie) • dynamische Quote in Wette einbinden Der Gewinn basiert auf der zur Wettabgabe geltenden dynamischen Quote. Dadurch muss jedes Wett-Objekt um die gültige Quote erweitert werden. Jeder Spieler erhält also je nach Zeitpunkt der Wettabgabe eine andere Quote. 3.3.3. Spielmodi Je nach Art des Spielmodus ist ein Unentschieden nicht möglich (Cup-Spielen, Viertel-, Halb-, Final...). Dies wird zurzeit noch nicht berücksichtigt. 3.3.4. Wetten ändern Insbesondere bei dynamischen Quoten will ein Spieler aufgrund von neuen Informationen seine Wette ändern oder sogar löschen können. Ob Löschen erlaubt werden soll, ist eine ideologische Frage. Schliesslich erlauben es reale Systeme wie TOTO auch nicht. Ein Ändern hingegen macht durchaus Sinn, zumindest bis zu Spielbeginn. 3.3.5. Mehrere Wetten mit einem Klick abschliessen Auf einer JSP-Seite werden mehrere Matches angezeigt. Deshalb sollte auch das Abschliessen von mehreren Wetten per Mausklick möglich sein. 3.3.6. Passwort vergessen Ein Benutzer, welcher sein Passwort vergessen hat, sollte die Möglichkeit haben, sich per Mausklick sein Passwort an die von ihm bei der Registrierung angegebene Email-Adresse schicken zu lassen. 3.3.7. Serverausfall Beim Ausfall eines Servers funktioniert der Zugriff auf einen anderen Server innerhalb der ETH dank Round-Robin gut. Hingegen besteht aufgrund von Caches in anderen DNS-Servern das Problem, dass möglicherweise auf einen nicht funktionierenden Server zugegriffen wird. Deshalb sollte mittels DDNS (Dynamic DNS) der entsprechende Server aus dem DNS-Eintrag gelöscht werden. Siehe dazu auch Anhang C: DNS Round-Robin und Dynamic DNS. - 12 - 3.3.8. User-Session Eine User-Session geht verloren, wenn der entsprechende Peer ausfällt. Eine mögliche Lösung ist über ein Session-Objekt die entsprechenden Daten in Clippee zu speichern. 3.3.9. Sollte man Pleite gehen können? Dies ist eine noch zu klärende Frage. Unsere Überlegungen diesbezüglich sind die folgenden: • • bei echtem Geld: ja. Ist das Geld aufgebraucht, ist ein Platzieren von Wetten nicht mehr möglich. Hingegen kann zusätzliches Geld einbezahlt werden und dann weiter gewettet werden. bei virtuellen Geld: wenn das Ziel ist, die Benutzer oft auf die Homepage zu locken, sollte ein Pleite gehen vermieden werden. Dies ist jedoch nicht leicht zu erreichen. Weil das Ziel jedes Spielers zu gewinnen ist, wird er täglich sein ganzes Geld wetten, um überhaupt eine Chance zu haben. Ein Maximaleinsatz pro Wette hilft nur bedingt. Eine umsetzbare Lösung scheint deshalb nicht zu existieren. - 13 - 4. Testwoche 4.1. Einleitung Gegen Ende des Projektes wurde eine Testwoche durchgeführt, bei der das Online Betting System (unter dem Namen Viveo NHL) öffentlich zugänglich gemacht wurde. Ziel war es, das System im Betrieb zu beobachten und in verschiedenen Bereichen Test durchzuführen und damit den Beweis der Funktionstüchtigkeit des Systems zu erbringen. Besonderes Augenmerk wurde dabei auf folgende Punkte gelegt: • Konsistenz der (redundant) verteilten Daten • Performance des Systems • Lastverteilung • Statistische Auswertung des Benutzerverhaltens • Akzeptanz des Systems bei den Benutzern In den meisten Punkten konnten die Erwartungen erfüllt oder sogar übertroffen werden. 4.2. Setting Das System war während der Testwoche auf drei Rechner verteilt, auf denen je eine Tomcat-Instanz lief, die je eine Instanz der Webapplikation und damit einen Clippee-Peer enthielt. Die drei Rechner konnten je mit eigener IP angesprochen werden, der DNS-Server war aber so eingerichtet, dass Requests auf viveo.ethz.ch nach dem Round-Robin-Verfahren auf die drei IPs verteilt wurden. 4.3. Probleme Während der Testwoche gab es verschiedene Probleme zu bewältigen, welche zum grössten Teil nicht-technischer Natur waren. Diese Art von Problemen wurde schon in kleineren Testläufen zuvor beseitigt. 4.3.1. Browser-Kompatibilität Obwohl die generierten HTML-Seiten allesamt dem strikten XHTML-Standard von W3C [W3C] entsprachen, gab es insbesondere bei Mac-Browsern Probleme mit der Darstellung. So war zum Beispiel auf Safari kein Login-Button sichtbar. Alle bekannten Probleme dieser Art sind mittlerweile behoben. Darstellungsprobleme gab es des Weiteren auf Mozilla/Netscape, welche jedoch bereits im Verlaufe der Testwoche behoben wurden. 4.3.2. Rechtliches Ein aufmerksamer Assistent eines ETH-Institutes wies darauf hin, dass solche „Glückspiele“ gemäss des Schweizerischen Lotteriegesetzes [Lotterie] nicht erlaubt seien. Doch da es sich bei Viveo NHL um einen nicht-kommerziellen Test im Rahmen eines Laborprojektes handelte, dürfte der Test legal gewesen sein. Auch die Verwendung der NHL und deren Logos war nicht gestattet gewesen. Um diese legal zu verwenden, bräuchte man deren Einverständnis, welche nicht vorlag. - 14 - Ein weiteres rechtliches Problem waren die Regeländerungen während der Testwoche. Einmal durfte ein Mitglied der DCGDolphins gewinnen, dann wieder nicht und schliesslich gewann dann doch ein Mitglied dieser Clique die Einzelwertung in Übereinstimmung mit den am Schluss gültigen Regeln. Für einige Verwirrung sorgte auch die Regeländerung nach den ersten Spielen – man durfte nur noch maximal 3000 Punkte pro Spiel setzen. 4.3.3. Peinlich … In diese Kategorie gehört die Tatsache, dass man sich während einer kurzen Zeit ohne Passwort als Administrator einloggen konnte. Dies deshalb, weil die entsprechende Stelle im Code (dort wo das Passwort überprüft wird) auskommentiert war und durch einen Standardwert ersetzt wurde. In dieselbe Kategorie gehört auch die Tatsache, dass sämtliche einen Tag zu früh angesetzt wurden. Das Hauptverschulden lag jedoch bei den Betreibern von [eishockey.com], welche die Zeitverschiebung falsch interpretierten. Noch vor den ersten Spielen konnte dieser Fehler korrigiert werden. 4.4. Statistiken Im folgenden Abschnitt werden einige interessante Zahlen und Fakten zur Viveo NHL Testwoche dargestellt. 4.4.1. Benutzer Total meldeten sich 152 Benutzer im System an. Davon platzierten 119 mindestens eine Wette und kamen somit in die Einzelrangliste. Insgesamt gab es etwas mehr als Tausend Logins. Am meisten Logins (233) pro Tag gab es am Tag nach der Nacht, in welcher die ersten Spiele stattgefunden haben. Dies war der Mittwoch, 21. Januar. An diesem Tag gab es auch den Stundenrekord (zwischen 17 und 18 Uhr) von 33 Logins. Abbildung 3 zeigt den Verlauf der Logins. Enttäuschend sind die ungefähr 50 Logins nach den letzten Spielen. Offenbar war das Wettsystem für viele Benutzer nicht mehr interessant, da sie keine Gewinnchancen mehr hatten. - 15 - Abbildung 3: Anzahl Logins pro Tag. Die Testwoche dauerte vom 21. bis 24. Januar. Es wurden 19 Cliquen gegründet. Die Durchschnitts-Clique hatte 3.8, die grösste 8 und die kleinsten Cliquen 2 Mitglieder. 4.4.2. Wetten Die Benutzer setzten in 1'306 Wetten insgesamt 509'649 Punkte. Dabei war jede zweite Wette (50.2 %) erfolgreich. Der aufsummierte Gewinn beträgt 770'604 Punkte. Dabei verteilten sich die Wetten gut auf die verschiedenen Spielnächte, wie Abbildung 4 zeigt. Der Abwärtstrend wurde am letzten Tag korrigiert, indem wieder vermehrt gewettet wurde. Offenbar wollten es viele Benutzer noch einmal wissen. Durchschnittlich platzierten die Benutzer 8.6 Wetten bei einer Standardabweichung von ungefähr 3 und einem Median von 6. Abbildung 5 zeigt wie viele Benutzer wie viele Wetten abgeschlossen haben. - 16 - Abbildung 4: Durchschnittliche Anzahl Wetten auf ein Spiel für jede Spielnacht Abbildung 5: Anzahl Wetten pro Benutzer 4.4.3. Verteiltheit Wie Abbildung 6 zeigt, funktionierte das DNS-Round-Robin sehr gut. Die Logins verteilten sich gleichmässig auf alle drei eingesetzten Peers bei einer Standardabweichung von 12.4 Logins beziehungsweise 1.2 Prozentpunkten. Und somit auch alle anderen Aktionen, welche ein Benutzer ausführen konnte, wie eine Wette platzieren. Denn einmal eingeloggt, verblieb ein Benutzer immer auf dem gleichen Peer bis er sich wieder neu einloggte. Somit wurde auch eine ausgeglichene Lastverteilung erreicht. Denn die Berechnungen für die neuen Daten wurden allesamt lokal auf einem Peer durchgeführt. - 17 - wllap13 wllap14 wllap15 #login 318 337 348 %login 31.7% 33.6% 34.7% Abbildung 6: Verteilung der Logins auf die einzelnen Peers 4.5. Akzeptanz beim Publikum Neben vereinzelten Stimmen materialisierte sich die Stimmung bei den Benutzern des Systems vor allem in der Auswertung einer Umfrage, die am Ende der Testwoche durchgeführt wurde. Die Teilnahme war nicht zwingend. 4.5.1. Auswertung der Umfrage Teilnehmer: 29 von 119 aktiven Benutzern (24%) Weiterführung von Viveo NHL • JA: 17 (59%) • NEIN: 3 (10%) • VIELLEICHT: 9 (31%) Ein System für die Europameisterschaft in Portugal 2004 • JA: 18 (62%) • NEIN: 4 (14%) • VIELLEICHT: 7 (24%) Etwas vermisst: • JA: 12 (41%) • NEIN: 17 (59%) (nicht aussagekräftig, da einige Neinsager unter Punkt 6 doch noch Verbesserungsvorschläge gemacht haben) Was wurde vermisst: • Quoten: 9 Nennungen • Ändern einer einmal abgeschlossenen Wette: 1 Nennung • Rangliste aussagekräftiger machen (z.B. durch Anzeigen der eingesetzten Punkte): 1 Nennung • Mindesteinsatz für jedes Spiel (z.B. 20% des Maximal-Einsatzes): 2 Nennungen • Cliquen: Nicht der Durchschnitt aller, sondern nur der besten sollte relevant sein: 1 Nennung • Chat-Funktionen, Messaging: 1 Nennung • Mehr Angaben zu Matches (Overtime...): 1 Nennung • NLA-Viveo: 1 Nennung • Allgemein mehr Möglichkeiten: 2 Nennungen Note fürs Design • Abgegebene Noten: 29 • Tiefste Note: 1.00 (2x) - 18 - • • • • Höchste Note: 6.00 (2x) Häufigste Note: 5.00 (14x) Durchschnitt: 4.21 (mit Streichnoten: 4.30) Alles: 2x1 1x2 3x3 7x4 14x5 2x6 Note Allgemein • Abgegebene Noten: 28 • Tiefste Note: 1.00 (1x) • Höchste Note: 6.00 (3x) • Häufigste Note: 5.00 (17x) • Durchschnitt: 4.64 (mit Streichnoten: 4.73) • Alles: 1x1 0x2 2x3 5x4 17x5 3x6 Bemerkungen • Explizites Kompliment: 4 Nennungen 4.6. Persistenz Clippee hält alle Daten im Arbeitsspeicher. Fällt ein Peer aus, verliert er daher seine Daten. Da alle Daten in allen Peers repliziert werden, sind sie in den noch laufenden Peers weiterhin vorhanden. Ist der ausgefallene Peer wieder einsatzbereit und verbindet sich mit den laufenden Peers, so werden die Daten wieder abgeglichen und sind wieder überall vorhanden. Sind jedoch einmal alle Peers zum selben Zeitpunkt ausgefallen (gleichzeitiger Ausfall oder einer nach dem anderen), so sind die Daten ganz verloren. Dies ist für ein System wie BetGetter/Viveo natürlich inakzeptabel, weshalb beschlossen wurde, Clippees Daten zusätzlich auf der Festplatte zu speichern. Implementiert wurde dies durch Loggen aller Änderungen von Clippee-Daten, und zwar jeweils lokal auf demjenigen Peer, von welchem die Änderung ausging. Es existiert daher auf jedem Peer ein aktuelles Logfile, welches von Peer zu Peer inhaltlich verschieden ist. Fallen nun tatsächlich alle Peers gleichzeitig aus, so müssen lediglich die Logfiles aller Peers wieder eingelesen werden, um das System wieder auf den Stand vor dem Ausfall zu bringen. Fällt ein einzelner Peer aus, so wird beim erneuten Einsatz ein frisches Logfile erstellt, wobei das alte Logfile weiter benötigt wird. Es ist daher zu beachten, dass beim Einlesen alle (unter Umständen mehrere pro Peer) Logfiles eingelesen werden müssen, welche seit dem Start des Systems oder dem letzten Totalausfall desselben angelegt wurden. Die konkrete Implementation verwendet eine Erweiterung des DataManagers von Clippee, namentlich betgetter.LoggingDataManager, welche bei jedem Aufruf der Methode updateObjectGlobally(DataObject o) das veränderte DataObject loggt. Die implementierte Persistenz ist daher unabhängig von BetGetter und kann von jedem auf Clippee aufbauenden System eingesetzt werden. Weiters gibt es die Möglichkeit, eine Momentaufnahme des Clippee-Datenraumes zu speichern. Hier werden alle Daten in ein einzelnes Dumpfile geschrieben. Dieses ist daher komplett und kann alleine wieder eingelesen werden. - 19 - 4.7. Performancetest Um zu ermitteln, wie gut das System skaliert, wurde beschlossen, Performancetests durchzuführen. Die Idee war, über eine HTTP-Verbindung Viveo anzusprechen und die Zeit zu messen, die benötigt wurde, um gewisse Aktionen durchzuführen, konkret das Erstellen eines neuen BetGetter-Users. Es sollte dann die Anzahl simultaner Verbindungen stetig erhöht werden, um Aussagen über die maximale Anzahl gleichzeitiger Benutzer machen zu können. Die Implementation des Perfomancetests befindet sich in der Klasse betgetter.util.PerformanceTester. Leider konnten nicht innert nützlicher Frist brauchbare Resultate erzielet werden. Die benötigte Zeit zum Erstellen eines Users schwankt im Bereich zweier Grössenordnungen, unabhängig von der Anzahl gleichzeitiger Anfragen, während sich die Geschwindigkeit beim Benutzen des Systems via Browser meist recht zügig anfühlt. Gemessen wird allerdings bloss die Zeit, die eine Methode des Java-Packages java.net benötigt, um die Anfrage durchzuführen und eine Antwort zu erhalten. Möglicherweise könnten mit der Verwendung eines anderen HTTP-Clients realistischere und brauchbarere Resultate erzielt werden. Dies auszuprobieren war leider aus Zeitgründen nicht mehr möglich. - 20 - 5. Installation / Konfiguration 5.1. Installation der Entwicklungs-Umgebung Folgende Komponenten werden verwendet: • • • • • • • • • 5.2. Windows XP Eclipse 2.1.1 http://www.eclipse.org/ Tomcat 4.1.27 (Achtung: Probleme mit Tomcat 4.1.29) http://jakarta.apache.org/tomcat/ Sysdeo Tomcat-Plugin für Eclipse 2.2.0 (Sysdeo) http://www.sysdeo.com/eclipse/tomcatPlugin.html Sysdeo erweitert Eclipse um einige Praktische Features wie z.B. Tomcat direkt aus Eclipse starten/debuggen etc. Lomboz JSP-Plugin für Eclipse 2.1.1 (Lomboz) http://www.objectlearn.com/ Lomboz ermöglicht JSP-Highlighting, Auto-Completion etc. mail.jar http://java.sun.com/products/javamail/ activation.jar http://java.sun.com/products/javabeans/glasgow/jaf.html jodd.jar http://jodd.sourceforge.net/ inifile.jar http://www.lebutch.org/inifiles.htm Eclipse-Einstellungen In Eclipse sind vier Projekte anzulegen: • • • • dcg clippee betgetter viveo (Java-Project) (Java-Project) (Java-Project) (Tomcat-Project) Das Projekt viveo enthält ein Verzeichnis 'viveo', welches das Root-Verzeichnis der Webapplikation ist. Die fünf *.jar-Files sind in das Verzeichnis viveo/WEBINF/lib zu kopieren. Der Kompilierungs-Output-Folder aller vier Projekte ist auf viveo/WEB-INF/classes einzustellen (Dies kann erreicht werden, in dem in dcg, clippee und betgetter je ein Verzeichnis erstellt wird, welches ein Link auf /WEBINF/classes darstellt). Unter Window > Preferences > Java > Compiler > 'Build Path' Muss die Option 'Scrup output folders on full build' DEAKTIVIERT werden. 5.3. Konfiguration des Systems Diverse Konfigurationen des BetGetter-Systems sind in der Datei config.ini vorzunehmen (z.B. die IPs der verschiedene Peers). Tomcat muss mitgeteilt werden, wo dieses File liegt. Das heisst, dass unter Windows > Preferences > - 21 - Tomcat > JVM_Einstellungen folgender Parameter zur JVM hinzugefügt werden muss (der Pfad muss evtl. angepasst werden): -DBETGETTER_CONFIG_FILE = C:\eclipse\workspace\betgetter\config.ini 5.4. Starten des Systems Tomcat starten. Beim ersten Aufruf einer JSP-Seite, welche die Klasse ApplicationBean einbindet, wird ein Clippee-Peer gestartet, der versucht, sich mit andern Peers zu verbinden. 5.5. Daten einlesen Mittels der Methode ApplicationBean.readTestdata() können Match-Daten aus einem in config.ini spezifizierten File eingelesen werden. Diese Testdaten sind im comma-separated-values-Format anzugeben, siehe Beispiel-Files im Verzeichnis betgetter/div - 22 - - 23 - Anhang A: Interfacedefinition Frontend – Backend Version 2.5 14.01.2004 User List getMatches(String teamID, int timeConstraint, int betConstraint, intMatchStateConstraint, String userID) The first four parameters specify constraints for which the returned list will be filtered. int createAccount(String userID, String email, String password) The returned integer is an errorcode that states success or a cause for the error. int login(String userID, String password) Returns an errorcode or ok if successed. int placeBet (String userID, String matchID, int x12, int wager) User getUser(String userID) MatchBet1X2 getMatchBet1X2(String matchID, String userID) Returns null if there is no Bet object for given match and user. List getUserRanking() Returns the whole ranking. List getUserRanking(int count) Returnes the top-count user ranking. int getUserRank(String userID) Returns the absolute rank of the user. List getRecentBets(String userID, int count) Returns a list of count matches that a user has placed bets for. The list is ordered descending date-order. List getRecentBetResults(String userID, int count) Returns a list of count matches that a user has placed bets for and the results exist. The list is ordered descending date order. int createClique(String userID, String cliqueID) List getCliqueRanking() List getCliqueRanking(int count) int getCliqueRank(String cliqueID) List getUserRankingOfClique(String cliqueID) Returns ranking for a clique (or null if clique does not exist). int getUserRankInClique(String userID, String cliqueID) Returns the rank of the user in a clique (or null if clique or user does not exist). - 24 - User getCliqueLeader(String cliqueID) boolean isUserLeaderOfClique(String userID, String cliqueID) List getCliquesForUser(int order, String userID) Returns an ordered list of cliques the userID is member of. int applyForClique(String userID, String cliqueID) int invitePalForClique(String cliqueID, String email, String senderUserID) List getRequestingPalsForClique(int order, String cliqueID) Returns list of cliques, [filter: order = ascending/descending userID]. int rejectPal(String cliqueID, String palID) List getCliquesForLeader(int order, String userID) Returns an ordered List of Cliques where userID is leader Clique getClique(String cliqueID) List getTeams() Admin int createMatch(String team1, String team2, Date date, String stadium, String city, float rate1, float rateX, float rate2) int setResult(String matchID, int score1, int score2) Changes the result of a match. int updateMatch(String matchID, String team1, String team2, Date date, String stadium, String city, float rate1, float rateX, float rate2) Changes details about a non terminated match, returns TOO_LATE if match is terminated or TEAM1_DOES_NOT_EXIST, TEAM2_DOES_NOT_EXIST, INVALID_DATE. int updateUser(String userID, String email, String password) Changes the users email and password List getUsers(int order, String firstLetter) [filter: order = ORDER_ASCENDING resp. ORDER_DESCENDING userID, firstLetter (ignoring case) of userID] int createTeam(String name) List getTeams() List getCliques(int order, String userID) Returns list of users with either members or pals with userID, [filter: order = ORDER_ASCENDING resp. ORDER_DESCENDING userID] - 25 - List getCliqueMembers(String cliqueID, int order) Returns list of users, [filter: order = ORDER_ASCENDING resp. ORDER_DESCENDING userID]. int addUserToClique(String cliqueID, String leaderID, String palID) int deleteUserFromClique(String userID, String cliqueID) MatchBet1X2Quote getQuoteForMatch(String matchID) Returns the quote for this match. List getMatches(String teamID, int timeConstraint, int betConstraint, int resultConstraint, int quoteConstraint, String userID) Returns a list of matches satisfying all filter constraints. void readTestdata() Reads some testdate from the file specified in config.ini. int dumpState(String fileName) Writes all clippee data to the specified file. Constants OK USERID_EXISTS_ALREADY USERID_DOESNT_EXIXT WRONG_PASSWORD NO_CONSTRAINT PAST FUTURE TODAY TOMORROW NEXT_WEEK YESTERDAY ALREADY_BET NOT_YET_BET NOT_ENOUGH_MONEY_ON_YOUR_ACCOUNT BET_NOT_POSSIBLE TOO_LATE TEAM1_DOES_NOT_EXIST TEAM2_DOES_NOT_EXIST INVALID_DATE ORDER_ASCENDING ORDER_DESCENDING TEAM_ALREADY_EXISTS MATCH_DOES_NOT_EXISTS MATCH_HAS_NOT_STARTED_YET CLIQUE_DOES_NOT_EXIST CLIQUE_LEADER_REJECTS_USER USER_IS_ALREADY_IN_CLIQUE CLIQUE_NAME_EXISTS_ALREADY and a few more, see ApplicationBean.java for details. - 26 - Anhang B: Datenmodell - 27 - Anhang C: DNS Round-Robin und Dynamic DNS DNS Round-Robin soll die Belastung auf alle Server gleichmässig verteilen. Die Statistik der Testwoche konnte dies auch bestätigen. Dadurch wird vermieden, dass ein einzelner Rechner alle Anfragen zu bearbeiten hat und durch Überlastung ausfällt. Fallen alle Server aus, funktioniert natürlich nichts mehr. Fällt nur ein einzelner Rechner aus, so wird bei einer erneuten Abfrage (Refresh) eine IP eines anderen Servers zurückgegeben. Dabei treten jedoch folgende Probleme auf: • Bei einem Webseitenaufruf wird in weiteren Nameservern bzw. der Clientapplikation (hier Webbrowser) aus Effizienzgründen auf einen Refresh des DNS-Eintrags verzichtet und stattdessen der bisherige Wert aus einem Cache gelesen. Fällt nun ein Server aus, so wird bei einem Refresh immer wieder der alte, aufgefallene Server angesprochen. Somit ist die Applikation blockiert, obwohl noch lauffähige Server vorhanden wären. No caching oder TTL niedrig/Null löst das Problem theoretisch, aber nicht alle DNS-Clients (Browser, weitere DNS-Server) achten darauf. • DNS Round-Robin, auch mit no caching oder TTL niedrig/Null, erkennt nicht, ob ein Server läuft oder nicht. Ein toter Server muss aber aus dem DNS-Eintrag entfernt werden, um nicht weiterhin angesprochen zu werden. Dies kann mittels Dynamic DNS geschehen. Zusätzlich wird eine Überwachung der Server gebraucht, welche die Einträge von ausgefallenen Servern aus dem DNS-Eintrag entfernt und solche von (wieder) hinzukommenden Servern hinzufügt. Die Frage stellt sich, wie schnell das System bei einem Ausfall eines Servers reagieren muss. Des Weiteren muss die Überwachung ausfallsicher sein. Dies könnte in Clippee und somit bei jedem Peer gemacht werden und zwar bei: • • Anmelden eines Peers Ausfall eines Peers Die Überwachung führt beim Erkennen eines ausgefallenen Peers (Clippee ist in der Lage, den Ausfall eines Peers zu detektieren) automatisch per Dynamic DNS ein Update aus. Aufgrund der erhaltenen Message entfernt der zuständige DNSServer den ausgefallenen Server aus dem DNS-Round-Robin-Eintrag. Kommt ein neuer Peer hinzu, wird er auf dieselbe Weise in den DNS-Eintrag geschrieben. Als Protokoll ist BIND vorzuschlagen. - 28 - Bibliographie [Clippee] Albrecht, K.; Arnold, R.; Wattenhofer, R., "Clippee: A LargeScale Client/Peer System", Department of Computer Science, ETH Zürich, 2003, http://www.distcomp.ethz.ch/publications/srdsws03.pdf [Tomcat] The Apache Jakarta Project, http://jakarta.apache.org/tomcat/ [W3C] W3C, World Wide Web Consortium, http://www.w3.org/ [Lotterie] Das Schweizerische Lotteriegesetz, http://www.admin.ch/ch/d/sr/935_51/a33.html [NHL] The National Hockey League, http://www.nhl.com [eishockey.com] Das NHL Eishockey Magazin im Web, http://www.eishockey.com [Java] http://java.sun.com/j2se/1.4.2/docs/api/ [Javadoc] http://java.sun.com/j2se/javadoc/ [CVS] Concurrent Versioning System, http://www.cvshome.org/ [Eclipse] The Eclipse Foundation, http://www.eclipse.org/ [IDEA] Intelli J IDEA, http://www.intellij.com/idea/ [BIND] Berkeley Internet Name Domain, http://www.isc.org/index.pl?/sw/bind/ Alle Internetseiten wurden am 26. Februar 2004 zuletzt besucht. - 29 -