mirror of
https://github.com/mudler/LocalAI.git
synced 2024-12-23 14:32:25 +00:00
36e185ba63
feat(p2p): allow to run multiple clusters in the same network Allow to specify a network ID via CLI which allows to run multiple clusters, logically separated within the same network (by using the same shared token). Note: This segregation is not "secure" by any means, anyone having the network token can see the services available in all the network, however, this provides a way to separate the inference endpoints. This allows for instance to have a node which is both federated and having attached a set of llama.cpp workers. Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package p2p
|
|
|
|
import "fmt"
|
|
|
|
const FederatedID = "federated"
|
|
|
|
func NetworkID(networkID, serviceID string) string {
|
|
if networkID != "" {
|
|
return fmt.Sprintf("%s_%s", networkID, serviceID)
|
|
}
|
|
return serviceID
|
|
}
|
|
|
|
type FederatedServer struct {
|
|
listenAddr, service, p2ptoken string
|
|
requestTable map[string]int
|
|
loadBalanced bool
|
|
}
|
|
|
|
func NewFederatedServer(listenAddr, service, p2pToken string, loadBalanced bool) *FederatedServer {
|
|
return &FederatedServer{
|
|
listenAddr: listenAddr,
|
|
service: service,
|
|
p2ptoken: p2pToken,
|
|
requestTable: map[string]int{},
|
|
loadBalanced: loadBalanced,
|
|
}
|
|
}
|
|
|
|
func (fs *FederatedServer) SelectLeastUsedServer() string {
|
|
// cycle over requestTable and find the entry with the lower number
|
|
// if there are multiple entries with the same number, select one randomly
|
|
// if there are no entries, return an empty string
|
|
var min int
|
|
var minKey string
|
|
for k, v := range fs.requestTable {
|
|
if min == 0 || v < min {
|
|
min = v
|
|
minKey = k
|
|
}
|
|
}
|
|
return minKey
|
|
}
|
|
|
|
func (fs *FederatedServer) RecordRequest(nodeID string) {
|
|
// increment the counter for the nodeID in the requestTable
|
|
fs.requestTable[nodeID]++
|
|
}
|
|
|
|
func (fs *FederatedServer) EnsureRecordExist(nodeID string) {
|
|
// if the nodeID is not in the requestTable, add it with a counter of 0
|
|
_, ok := fs.requestTable[nodeID]
|
|
if !ok {
|
|
fs.requestTable[nodeID] = 0
|
|
}
|
|
}
|