最近用JADE去模拟一个基于gossip的分布式系统,为了实验师兄设计的p2p管理协议。规模大概在1000个Agent左右,其实每台server跑个2000个也不成问题,但花了不少开销在同步和中心管理上,最终每台server只跑了500个。
用了之后,感觉JADE确实比较强大,我只用了其中很少一部分东西。
下面是我的一些理解和应用:
1、每个JADE平台可以容纳不同的容器(我用的时候,一个容器对应了一台server),但只准有一个主容器,容器中多个Agent(可以根据每个容器的AMS或者DF去查询其中的各个Agent,但好像只有AID的信息).当然,对于我们来说,各容器中的确Agent是透明,不用知道他们是哪的(ip)。
2、每个Agent其实是个线程,JADE把线程的方法重新封装了一下,比如建立Agent的方法setup()其实对应的是start(),doDelete()对应destroy()等。每个Agent有一个AID,用于标识不同的个体(但不能通地过AID取到Agent实体)。每个Agent建立时都会去AMS(Agent Manage System)中去注册。
每个分布式系统(网络上的节点)继承了Agent,添加了更多需要用到的属性(如节点的ID,邻居节点信息等)
3、可以对Agent添加不同的行为,简单行为/循环行为/定时行为等,我主要用了后两者,循环行为用来监听接收消息(ACLMessage,用的blockReceive()方法,用receive()可能开销更大一些),定时行为用来定时更新操作(更新节点信息),每个定时行为又重新封装成了节点的子线程,避免与监听消息冲突。
4、JADE消息机制比较强大,每个Agent有一个发送队列和接收队列,可以发送字符串,也可以发可序列化对象(可以是比较复杂的对象,但要保证复杂对象的所有属性都是可序列化的)。消息体本身有发送者(AID)、接收者(AID)、语言(可以自己设定,根据不同语言对应不同的语义)、内容、策略等。利用Agent中的send()方法进行发送,receive()或blockReceived()方法进行接收。
由于无法根据AID取到Agent的实体,我用了比较笨的方法,在主容器中建了一个MAP,保存每个节点的副本,每个节点定期发送自己的副本到主容器进行更新(这个开销就比较大了,暂时没想到比较好的方法),某节点A要用到其他节点B时,要么直接给B发消息请求信息,要么向主容器请求。
用了之后,感觉JADE确实比较强大,我只用了其中很少一部分东西。
下面是我的一些理解和应用:
1、每个JADE平台可以容纳不同的容器(我用的时候,一个容器对应了一台server),但只准有一个主容器,容器中多个Agent(可以根据每个容器的AMS或者DF去查询其中的各个Agent,但好像只有AID的信息).当然,对于我们来说,各容器中的确Agent是透明,不用知道他们是哪的(ip)。
2、每个Agent其实是个线程,JADE把线程的方法重新封装了一下,比如建立Agent的方法setup()其实对应的是start(),doDelete()对应destroy()等。每个Agent有一个AID,用于标识不同的个体(但不能通地过AID取到Agent实体)。每个Agent建立时都会去AMS(Agent Manage System)中去注册。
每个分布式系统(网络上的节点)继承了Agent,添加了更多需要用到的属性(如节点的ID,邻居节点信息等)
3、可以对Agent添加不同的行为,简单行为/循环行为/定时行为等,我主要用了后两者,循环行为用来监听接收消息(ACLMessage,用的blockReceive()方法,用receive()可能开销更大一些),定时行为用来定时更新操作(更新节点信息),每个定时行为又重新封装成了节点的子线程,避免与监听消息冲突。
4、JADE消息机制比较强大,每个Agent有一个发送队列和接收队列,可以发送字符串,也可以发可序列化对象(可以是比较复杂的对象,但要保证复杂对象的所有属性都是可序列化的)。消息体本身有发送者(AID)、接收者(AID)、语言(可以自己设定,根据不同语言对应不同的语义)、内容、策略等。利用Agent中的send()方法进行发送,receive()或blockReceived()方法进行接收。
由于无法根据AID取到Agent的实体,我用了比较笨的方法,在主容器中建了一个MAP,保存每个节点的副本,每个节点定期发送自己的副本到主容器进行更新(这个开销就比较大了,暂时没想到比较好的方法),某节点A要用到其他节点B时,要么直接给B发消息请求信息,要么向主容器请求。