Skalieren in SharePoint – Geht auch einfach?

Immer öfter komme ich in letzter Zeit mit Kunden in Kontakt, die erhebliche Mengen an Informationen ansammeln. Wer den SharePoint dabei ein bisschen kennt, der wird sich bestimmt auch schon folgende Frage gestellt haben:

Wie gehe ich mit immer größer werdenden Datenmengen um? Geht das überhaupt mit SharePoint?

Folgt man diesem Link, dann sehen die Limits vom SharePoint erstmal nicht schlimm aus. 30.000.000 Dokumente pro Bibliothek? Kein Problem? Falsch! Zwar ist dies als Limit angegeben, hier handelt es sich aber in den wenigsten Fällen um realistische Szenarien. Wie oft ist eine Anforderung des Kunden, Dokumente individuell zu berechtigen? Wie werden diese Dokumente aufgerufen? Schnell fallen folgende Einschränkungen ins Auge:

  • Schwellenwert für die Listenansicht: 20.000 Dokumente
  • Sicherheitsbereich: 50.000 Dokumente pro Liste

Hier bewegen wir uns ganz schnell in kleineren Mengen. Wie also sicherstellen, dass bei Kunden, die oftmals mehr als 50.000 Dokumente pro Jahr erstellen, keine Einschränkungen in der Performance entstehen? In diesem Blogbeitrag möchte ich euch zeigen, wie wir in einem Projekt Dokumente auf verschiedene Bibliotheken aufgeteilt haben, um eben nicht an die Grenzen des SharePoint zu kommen. Das Ganze haben wir mit PowerShell umgesetzt und sieht wie folgt aus:

try
    {
        $year = CalculateYear $item $fieldDate;
        $library = GetLibrary $year $item;
        $folder = GetFolderForDocument $library $fieldFolder $item;
        #Datei verschieben
        $item.File.MoveTo($folder.Url + "/" + $item.File.name)
    }
    catch [System.Exception] 
    { 
        $errorTxt = "Fehler in MoveFile (" + $item.Url + "): " + $_.Exception.ToString();
        LogError $errorTxt;
    }

 

In diesem ersten Abschnitt des Skriptes suchen wir nach allen Elementen, die verschoben werden sollen. Für jede konfigurierte Liste bauen wir eine CAML für die Dokumente, die wir verschieben wollen. In unserem Fall haben wir vorher noch zwei Anforderungen:

  • Jedes Dokument bekommt an Hand eines Metadatums bestimmte Berechtigungen. Dafür muss dieses Metadatum im Dokument vorhanden sein, was wir mit $internalNameFoldername prüfen. Diese Variable sorgt später auch für die Erstellung eines kundenspezifischen Ordners.
  •  Wir wollen Nutzern eine gewisse Zeit für die Bearbeitung lassen, bevor wir das Dokument verschieben. Wir verschieben demnach nur Dokumente, die älter als eine definierte Zeit $dateAndTime sind

Mit der Funktion „MoveFile“ verschieben wir dann das Dokument:

#alle Konfigurierten Listen durchgehen
    foreach($listConfig in $config.ChildLists.Lists)
    {
        $list = $web.GetList($listConfig.Url);

        $spQuery = New-Object Microsoft.SharePoint.SPQuery;
        $spQuery.Folder = $list.RootFolder;

        if($list.BaseType -eq "DocumentLibrary")
        {
			$spQuery.ViewAttributes = "Scope='Recursive'";								 
            $spQuery.Query = "<Where><And><And><BeginsWith><FieldRef Name='ContentTypeId'/><Value Type='ContentTypeId'>0x0101</Value></BeginsWith><IsNotNull><FieldRef Name='" + $internalNameFoldername + "' /></IsNotNull></And><Leq><FieldRef Name='Created' /><Value Type='DateTime' IncludeTimeValue='TRUE'>" + $dateAndTime +"</Value></Leq></And></Where>";# nur Dateien, keine Ordner
        }

        $spQuery.RowLimit = 100;
        do
        {
            $listItems = $list.GetItems($spQuery);
            $spQuery.ListItemCollectionPosition = $listItems.ListItemCollectionPosition;
            for($i = $listItems.Count-1; $i -ge 0; $i--)
            {
                $item =  $listItems[$i];
                
                if($list.BaseType -eq "DocumentLibrary")
                {
                    MoveFile $internalNameDate $internalNameFoldername $item;
                }
            }
        }
        while ($spQuery.ListItemCollectionPosition -ne $null)
    }

Die Datei soll in unserem Fall immer an eine ganz bestimmte Stelle verschoben werden.

  • In eine Jahresbibliothek entsprechend des Dokumentendatums
  • In einen Ordner entsprechend der Kundennummer

Diese Informationen müssen wir vorher berechnen. Für das Jahr benötigen wir den Feldwert „Datum“ aus dem Dokument, welchen wir der Funktion übergeben. Die Jahresbibliothek wird dann an Hand des Dokumentenjahres bestimmt und, falls benötigt, auf Grundlage der Templates der Ausgangsbibliothek erstellt. Der Folder wird ebenfalls an Hand eines übergebenen Feldes bestimmt und, falls benötigt, erstellt. Sind alle Informationen bestimmt, verschieben wir das Dokument mit der PowerShell-Funktion „File.MoveTo“.

Am Ende haben wir das Ganze als geplanten Task eingebunden, welcher Zeitgesteuert ausgeführt wird und somit permanent die Items an die entsprechende Stelle verschiebt. Damit die verschiedenen Bibliotheken für den Nutzer nicht sichtbar sind und dieser nur eine Oberfläche sieht, nutzen wir unter anderem ecspand für die Darstellung.

Wie sind eure Erfahrungen zum Thema Skalierung? Habt ihr andere Lösungsansätze? Ich freue mich auf weitere kreative Ansätze!

Leave a Comment

Your email address will not be published. Required fields are marked *