## Global Event

Global Event是bukcy框架提供的一个非常有用的组件。实现了一个逻辑上非常常用的功能：
>“在系统中定义一个全局事件，然后在任何一段代码中都可以Attach这个事件，在任何一段代码中都可以Fire这个事件。”   

在传统的后台开发中，我们常常使用消息中间件来达到类似功能。从过去的经验来看，我们鼓励应用尽量使用端到端的无状态事件系统（即系统允许丢失事件），当然bucky也允许用户开发自己的有状态事件系统。    

Global Event的使用也很简单：

#### 创建并监听事件
```javascript
let em = getCurrentRuntime().getGlobalEventManager();
let eventCategory = 'myEventCatagory';
let eventID = 'myMessage';

// create an event catagory
em.create(eventCategory, (result) => {

	// attach an eventID on the event catagory
	console.log(`${eventCategory} is created:${result}`);
	em.attach(eventCategory, eventID, (msg) => {
		console.log(`${eventCategory}/${eventID} is fired:`, msg);
	};
});
```

#### 触发事件
```javascript
let em = getCurrentRuntime().getGlobalEventManager();
let eventCategory = 'myEventCatagory';
let eventID = 'myMessage';

// Fire the eventID on the event catagory
let msg = JSON.stringify({
    cmd:'echo',
    body:{
        text:'Real-world programming, however, requires care, expertise, and wisdom.',
        from:'SICP'
    }
});
em.activeEvent(eventCategory, eventID, msg);
```

#### 代码说明
从上述代码中我们可以看出来：
1. Global Event的操作接口都是异步的。
2. Global Event的由event catagory/eventID两层结构构成，方便用户组织事件的名字空间。
3. Global Event的参数是一个字符串，我们一般鼓励在里面填写一个stringfiy后的JSON.
4. Global Event是应用程序全局的，所以具有分布式系统在一致性方面的特性：attach成功之后存在与事件控制器失去链接的可能，而系统并不会保证在失去连接的这段时间内产生的事件不会丢失。