Exemplo n.º 1
0
func New(servicename, serviceport string) (*Ring, error) {
	// XXX 在Mac上调试时,Mac没有eth0接口,会导致ring.New()失败。
	// 建议增加一个参数,允许用户传入指定的Interface(因此用户程序可以将该配置写入配置文件)。
	// 目前考虑到API兼容性,在上述方法获得一致同意前,不改动API,而是从环境变量读取。
	iface, ok := os.LookupEnv("RING_SERVER_INTERFACE")
	if !ok {
		iface = "eth0"
	}
	localIp, err := externalIP(iface)
	if err != nil {
		return nil, err
	}
	mc, err := cache.NewCache("memory", `{"interval":60}`)
	if err != nil {
		return nil, err
	}

	serverId := localIp + ":" + serviceport + ":" + strconv.Itoa(os.Getpid()) + ":" + strconv.FormatInt(startTime, 10)

	r := Ring{
		selfServerId: serverId,
		servicename:  servicename,
		hashring:     hashring.New([]string{serverId}),
		stop:         make(chan struct{}),
		cache:        mc,
	}
	r.register()
	r.subscribe()
	return &r, nil
}
Exemplo n.º 2
0
func NewUniq(input chan *Packet) (<-chan *Packet, error) {
	mc, err := cache.NewCache("memory", `{"interval":60}`)
	if err != nil {
		return nil, err
	}

	s := stream{
		id:      uuid.NewV4().String(),
		in:      input,
		out:     make(chan *Packet),
		cache:   mc,
		lostMap: make(map[string]*waitingBuffer),
	}
	s.run()
	return s.out, nil
}